GSON: синтаксический анализ значения ключа JSON с объектом иногда и массивом - PullRequest
0 голосов
/ 22 мая 2018

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

Resonse with Array

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

Resonse with Object

{
   "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;
   }
}

Но это всегда происходит из-за массива и объекта типа данных. Я также пытался использовать JsonDeserializer, но я думаю, что я не реализовал это хорошо.помогите мне разобраться и разобрать json

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Просто попробуйте получить доступ как Object, затем проверьте instanceof 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);
 }
0 голосов
/ 23 мая 2018

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

gson.fromJson(jsonString, classOfModel)

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

0 голосов
/ 22 мая 2018

Также добавьте имя SerializedName для объекта и добавьте пользовательский метод получения

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;
       }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...