У меня есть три вложенных класса:
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, а не Jackson. Таким образом, нет возможности использовать @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"}
Из вашего класса и ошибки кажется, что вы получаете массив в B b; в Класс А. Мы можем сказать точную проблему, если вы поделитесь 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 здесь.
Я обновил вопрос и предоставил возвращенное содержимое файла JSON
Я немного смущен. Возвращенный класс уже определен в моем проекте Android. Поскольку я сам написал код веб-службы, который я пытаюсь использовать в проекте Android. Итак, возвращаемый класс уже определен, и мне не нужно создавать класс POJO в этом случае, верно?
Ошибка связана с тем, что вы неправильно определили возвращаемый класс.
Спасибо за ваш ответ, возвращенный класс такой же, как и отправленный класс, я только что скопировал и вставил, поскольку я тот, кто запрограммировал отправленный класс.
Я обновил свой ответ, надеюсь, это поможет.