使用 GSON json 封装 Android

Using GSON to json envelop Android

在尝试使用以下两行使用 GSON 库读取和存储 json 信封时,应用程序崩溃(请参阅错误日志)。解析有什么问题。

Type listType = new TypeToken<ArrayList<MRechercheResult>>() {}.getType();
        List<MRechercheResult>search_results  = new Gson().fromJson(envelop, listType);

错误日志

04-21 11:16:59.971: E/AndroidRuntime(19633): FATAL EXCEPTION: main
04-21 11:16:59.971: E/AndroidRuntime(19633): com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 178
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.Gson.fromJson(Gson.java:803)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.Gson.fromJson(Gson.java:768)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.Gson.fromJson(Gson.java:717)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at waoo.app.fragment.RechercheResult.saveJson(RechercheResult.java:255)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at waoo.app.fragment.RechercheResult.handleMessage(RechercheResult.java:218)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at android.os.Looper.loop(Looper.java:137)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at android.app.ActivityThread.main(ActivityThread.java:5306)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at java.lang.reflect.Method.invokeNative(Native Method)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at java.lang.reflect.Method.invoke(Method.java:511)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at dalvik.system.NativeStart.main(Native Method)
04-21 11:16:59.971: E/AndroidRuntime(19633): Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 178
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.stream.JsonReader.nextString(JsonReader.java:821)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:358)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.TypeAdapters.read(TypeAdapters.java:346)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.read(ReflectiveTypeAdapterFactory.java:93)
04-21 11:16:59.971: E/AndroidRuntime(19633):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
04-21 11:16:59.971: E/AndroidRuntime(19633):    ... 16 more

模特

public class MRechercheResult {


    public String id_profil;
    public String id_customer;
    public String profil;
    public String profil_photo;
    public String email;
    public String agenda;

    public List<Activite> activite;

}

public class Activite {

    public String day;
    public String from;
    public String to;

}

您可以在此处找到 json 信封:

http://pastie.org/private/ipirfc9pgftd8lmjaoipog

agenda 是另一个 json 对象的数组,而不是字符串.. 在 MRechercheResult class 中更改您的议程类型。 使用 http://www.jsonschema2pojo.org/ 为 json 字符串

生成 pojo classes

您在第二个 url 中缺少反斜杠转义。

应该是https:\/\/而不是https:\/\

希望这对您有所帮助。使用 gson 时您需要注意变量名称和类型 :)

public class MRechercheResult {


        public String id_profil;
        public String id_customer;
        public String profil;
        public String profil_photo;
        public String email;
        public Agenda[] agenda;

        public Activite[] activite;

    }

    public class Activite {

        public String day;
        public String from;
        public String to;

    }

        public class Agenda {
        String day;
        String from;
        String to;
    }

}

您的 json 不是以 Object 开头。所以,我执行以下步骤:

First:用对象(我命名为"example")包装你的第一个数组对象

{
    "example": [
    {  
      "id_profil":"2",
      "id_customer":"3",
      "profil":"Spartan GYM",
      "profil_photo":"https:\/\/waoo.com\/img\/profil_pic\/job_provider-54b791f46d7b53.09461979.png",
      "email":"",
      "agenda":[  
            ...
      ],
      "activite":[  
      ]  
    },
    {
        ....
    }
    ]
}

其次: 定义Full.java class:

public class Full {
    public List<Example> example = new ArrayList<>();

    class Example {
        public String id_profil;
        public String id_customer;
        public String profil;
        public String profil_photo;
        public String email;
        public List<Agenda> agenda = new ArrayList<Agenda>();
        public List<Activite> activite = new ArrayList<Activite>();

        class Agenda {

            public String day;
            public String from;
            public String to;

        }

        class Activite {

            public String id_profil_style_activite;
            public String activite_name;

        }
    }
}

Then:定义class通过asynctask获取数据:

private class ParseByGson extends AsyncTask<String,Void,Full> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Full doInBackground(String... params) {
        Full fullContents = null;
        try {
            URL url=new URL(params[0]);
            InputStreamReader reader=new InputStreamReader(url.openStream(),"UTF-8");
            fullContents=new Gson().fromJson(reader,Full.class);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fullContents;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(Full results) {
        super.onPostExecute(results);
        Log.e(">>",results.example.get(0).id_customer+"--"+results.example.get(0).activite.get(0).activite_name+"--"+results.example.get(0).agenda.get(0).day+"--");
    }
}

终于,使用起来:

ParseByGson parseByGson = new ParseByGson();
parseByGson.execute(url_of_your_json);