Ошибка синтаксического анализа gson при обнаружении одинаковых ключей с разными значениями в json - PullRequest
0 голосов
/ 22 октября 2018

Получение большого ответа JSON от API (сгенерированного Джексоном), и объект имеет свое значение только при первом появлении в ответе.Второй раз, когда приходит тот же объект (с тем же ключом), он заменяется каким-то номером / идентификатором.

JSON-ответ выглядит как

[{id:1,Person:{name:"xyz",age:30}},
{id:2,Person:1}]

Теперь я хочу сохранить весь ответ в списке, следуя коду GSON

Type listType = new TypeToken<List<MainModel>>() {}.getType();
yourMainList = new Gson().fromJson(myres, listType);
//here myres is whole response and MainModel is my pojo class mapped with JSON response keys

, но при дублировании выдает следующую ошибкуключ с идентификатором / номером прибывает во второй раз в ответ.

IllegalStateException: ожидаемый BEGIN_OBJECT, но был NUMBER в строке 1 столбца 11935 путь $ [1].на com.google.gson.stream.JsonReader.beginObject

Есть ли способ проанализировать такой JSON через GSON в Android?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Один из вариантов - использовать пользовательский JsonDeserializer для проблемного поля, это может быть как:

public class PersonDeSerializer implements JsonDeserializer<Person> {
    @Override
    public Person deserialize(JsonElement json, Type typeOfT, 
                JsonDeserializationContext context)
            throws JsonParseException {
        try {
            return context.deserialize(json, typeOfT);
        } catch (JsonSyntaxException e) {
            // return null to elave null or make whatever kind of a person
            return null;
        }
    }
}

, а затем вы можете установить проблемное поле, десериализованное этим адаптером, например:

public class MainModel {
    private Long id;

    @JsonAdapter(PersonDeSerializer.class)
    private Person Person;  // should be person, but is Person in JSON
}
0 голосов
/ 22 октября 2018

Вам необходимо решить, как вы будете обрабатывать различные варианты класса Person.Вот самый простой способ сделать это, используя com.google.gson.JsonParser .

private void start() {
    String json = "[{id:1,Person:{name:\"xyz\",age:30}},\n" +
            "{id:2,Person:1}]";

    HashMap<Integer, Person> map = new HashMap<>();

    JsonArray items = new JsonParser().parse(json).getAsJsonArray();
    items.forEach(jsonElement -> {
        JsonObject jsonObject = jsonElement.getAsJsonObject();
        int id = jsonObject.get("id").getAsInt();
        JsonElement element = jsonObject.get("Person");
        if(element.isJsonObject()){
            JsonObject personObject = element.getAsJsonObject();
            Person person = new Person();
            person.name = personObject.get("name").getAsString();
            person.age = personObject.get("age").getAsInt();
            map.put(id, person);
        }
        else {
            int personValue = element.getAsInt();
            map.put(id, new Person(personValue));
        }
    });

    for (int id : map.keySet()) {
        Person person = map.get(id);
        Log.d("myTag", id + ", name: " + person.name + ", age: " + person.age);
    }
}

class Person{
    String name;
    int age;

    Person(){}

    Person(int personValue) {
        // decide how the object should look
    }
}

Выходы:

1, имя: xyz, age: 30
2, name: null, age: 0

Если вам нравится работать более общим образом без жесткого ввода имен полей, вы можете использовать Пользовательская десериализация Gson

...