Разбор составленного файла JSON с помощью gson в Android - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть три вложенных класса:

public class A {
   String s1;
   String s2;
   String s3;
   String s4;
   String s5;
   String s6;
   String s7;
   String s8;
   B b;
}

public class B{
   private Map<String, C> ag = new HashMap<>();
}

public class C{
   private Map<String, Boolean> ar = new HashMap<>();
}

Класс A отправляется как ответ метода GET типа JSON в приложение Android, которое использует службу, как показано ниже:

Gson gson = new GsonBuilder()
   .enableComplexMapKeySerialization()
   .setLenient()
   .create();

Retrofit r = new Retrofit.Builder()
   .baseUrl(url)
   .addConverterFactory(GsonConverterFactory.create(gson))
   .build();

...

Однако при запуске приложения для Android я получаю следующую ошибку:

E/Rest GET Error: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line ? column ? B.ag.

Имея в виду, что если я удалю поле класса b из класса A, все пройдет гладко.Похоже, что gson не может десериализовать составленный файл JSON.Так что же делать?

Примечание. Файл JSON успешно извлекается из веб-службы Restful с использованием MOXy, а не Джексона.Поэтому нет возможности использовать @ JsonDeserialize.

Ниже приведен возвращенный файл JSON:

{"b":{"ag":{"entry":[{"key":"AS2","value":{"ar":{"entry":[{"key":"s1","value":false},{"key":"s2","value":false},{"key":"s3","value":false},{"key":"s4","value":false},{"key":"s5","value":false},{"key":"s6","value":true},{"key":"s7","value":false},{"key":"s8","value":false}]}}},{"key":"AS3","value":{"ar":{"entry":[{"key":"s1","value":false},{"key":"s2","value":true},{"key":"s3","value":true},{"key":"s4","value":false},{"key":"s5","value":false},{"key":"s6","value":false},{"key":"s7","value":false},{"key":"s8","value":true}]}}},{"key":"AS1","value":{"ar":{"entry":[{"key":"s1","value":false},{"key":"s2","value":true},{"key":"s3","value":true},{"key":"s4","value":false},{"key":"s5","value":false},{"key":"s6","value":false},{"key":"s7","value":false},{"key":"s8","value":false}]}}}]}},"s1":"string1","s2":"string2","s3":"string3","s4":"string4","s5":"string5","s6":"string6","s7":"string7","s8":"string8"}

1 Ответ

0 голосов
/ 28 сентября 2018

Исходя из вашего класса и ошибок, при условии, что вы получаете Array на B b; в Class A .Мы можем сказать точную проблему, если вы поделитесь jsonResponse.

---- Обновлено ---

Измените Класс B

Class B{
    private Ag ag;
}

class Ag {
    List<Entry> entry;
}

class Entry{
    String key;
    Value value;
}

class Value{
    Ar ar;
}

class Ar{
    List<ArEntry> entry;
}

class ArEntry{
    String key;
    Boolean value;
}

Вот как ваши классы для jsonResponse вы предоставили.

Вы можете преобразовать любой ответ json в pojo здесь или вы можете добавить плагин для Android Studio здесь .

...