У меня есть три вложенных класса:
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"}