GSON: анализ значения ключа JSON с помощью sometime Object & иногда Массив

Sandip Patel спросил: 28 апреля 2018 в 08:36 в: android

Я использую GSON для разбора JSON String, но есть ключ, содержащий Json, который когда-то является объектом, а иногда и массивом. Поэтому, пожалуйста, помогите мне разобрать его для моделирования класса с помощью gson.

Ответ с Массив

{
   "key" : "test",
   "value" : [
                {
                  "id" : 1,
                  "name": "abc"
                },
                {
                  "id" : 2,
                  "name": "xyz"
                }
             ]
}

Ответ с объектом

{
   "key" : "test",
   "value" : {
                 "id" : 1,
                 "name": "abc"
             }
}

MyModel.java

public class MyModel implements Serializable {
@SerializedName("key")
@Expose
public String key;@SerializedName("value")
@Expose
public ArrayList<ValueModel> value;public class ValueModel implements Serializable {
    @SerializedName("id")
    @Expose
    public String id;    @SerializedName("name")
    @Expose
    public String name;
   }
}

Но он всегда был в exeption из-за массива datatype, а objectI также пытался с JsonDeserializer, но я думаю, что я не реализовал его правильно. Пожалуйста, помогите мне решить его и проанализировать json


4 ответа

MJM ответил: 28 апреля 2018 в 09:00

Простая попытка получить доступ к объекту, а затем проверить экземпляр объекта Object и проанализировать данные на основе этого

String json="";JSONObject jsonMain=new JSONObject(json);Object objectType=jsonMain.get("value");
  if (objectType instanceof JSONObject) {
    JSONObject jsonObjectType=(JSONObject)objectType;
  } else if (json instanceof JSONArray) {
    JSONArray jsonArrayType=(JSONArray)objectType;
  }

Если вы используете JSONObject

  if (objectType  instanceof JSONObject) {
     UserDetails details = new Gson().fromJson(objectType, UserDetails.class); } else if (objectType  instanceof JSONArray) {
     Type listType = new TypeToken<List<UserDetails>>() {
     }.getType();
     List<UserDetails> list = new Gson().fromJson(objectType, listType);
     userDetailsList.addAll(list);
 }
Sandip Patel ответил: 28 апреля 2018 в 08:56
Я получил ваш ответ, но в соответствии с этим я определяю его только объект или массив, но я хочу преобразовать объект в массив if. И эта функциональность предоставляет GSON. Пожалуйста, посмотрите stackoverflow.com/questions/7668507/gson-handle-object-or-array
Sandip Patel ответил: 28 апреля 2018 в 08:56
Я хочу обработать его в самой модели
MJM ответил: 28 апреля 2018 в 09:01
@SandipPatel я обновил ответ, вам нужно использовать смесь как обработки модели, так и ручного разбора, потому что JSONResponse не фиксирован
Sandip Patel ответил: 28 апреля 2018 в 08:48
Я хочу преобразовать объект в массив, если есть объект, и если массив, то это нормально.
Sam Raju ответил: 28 апреля 2018 в 08:56

Добавить имя SerializedName для объекта и добавить пользовательский getter

public class MyModel implements Serializable {
      @SerializedName("key")
      @Expose
      public String key;      @SerializedName("value")
      @Expose
      public ArrayList<ValueModel> valueList;      @SerializedName("value")
      @Expose
      ValueModel modelValue;      public List<ValueModel> getValueModel() {
          return Collections.singletonList(modelValue);
       }public class ValueModel implements Serializable {
        @SerializedName("id")
        @Expose
        public String id;        @SerializedName("name")
        @Expose
        public String name;
       }
     }
Sandip Patel ответил: 28 апреля 2018 в 08:51
Это можно сделать с помощью JsonDeserializer или JsonAdapter, но я не знаю, как его реализовать. Если вы знаете, тогда, пожалуйста, помогите мне реализовать его. Благодарю.
Sam Raju ответил: 28 апреля 2018 в 08:57
я обновляю свой ответ, пожалуйста, проверьте, что вы также можете использовать public List<ValueModel> getValueModel () { return Arrays.asList(modelValue); }
Sandip Patel ответил: 28 апреля 2018 в 09:00
Вы использовали два разных объекта для одиночного ключевого значения. Но GSON предоставляет JsonAdapter или JsonDeserializer для этого, но я не могу его хорошо понять. обратитесь к этой ссылке stackoverflow.com/questions/7668507/gson-handle-object-or-array
Sam Raju ответил: 28 апреля 2018 в 09:06
Спасибо, что предоставили мне новую ценную информацию. вы можете использовать JsonAdapter (например, ссылку, которую вы опубликовали), чтобы решить вашу проблему.
Duong Anh ответил: 28 апреля 2018 в 03:00

Вы можете попробовать:

gson.fromJson(jsonString, classOfModel)

И я думаю, вы можете удалить теги @SerializedName и @Expose.