Ответ 1
Руководство пользователя Gson явно описывает это:
У вас есть объект с полем tr
которое представляет собой массив, содержащий произвольные типы.
Руководство пользователя объясняет, что вы не можете напрямую десериализовать такую структуру и рекомендует:
Используйте API-анализатор Gson (низкоуровневый потоковый анализатор или DOM-парсер JsonParser) для анализа элементов массива, а затем используйте Gson.fromJson() для каждого из элементов массива. Это предпочтительный подход.
В вашем случае... это будет действительно зависеть от того, какие объекты были возможны в этом массиве. Если у всех будет тот же самый внутренний объект, который вы хотите сделать, например...
List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = parser.parse(json).getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je : array)
{
Set<Map.Entry<String,JsonElement>> set = je.getAsObject().entrySet();
JsonElement je2 = set.iterator().next().getValue();
MyUserPojo mup = new Gson().fromJson(je2, MyUserPojo.class);
list.add(mup);
}
И, конечно, это должно быть внутри пользовательского десериализатора для вашего фактического объекта, который будет иметь поля tr
и results
.
class MyPojo
{
List<MyUserPojo> userList;
int results;
}
class MyUserPojo
{
String userId;
String address;
}
class MyDeserializer implements JsonDeserializer<MyPojo>
{
@Override
public MyPojo deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
List<MyUserPojo> list = new ArrayList<MyUserPojo>();
JsonArray array = je.getAsJsonObject().getAsJsonArray("tr");
for (JsonElement je2 : array)
{
Set<Map.Entry<String,JsonElement>> set = je2.getAsObject().entrySet();
JsonElement je3 = set.iterator().next().getValue();
MyUserPojo mup = new Gson().fromJson(je3, MyUserPojo.class);
list.add(mup);
}
MyPojo mp = new MyPojo();
mp.tr = list;
mp.results = je.getAsObject().getAsJsonPrimitive("results").getAsInt();
return mp;
}
}
Теперь вы все настроены - вы можете использовать этот десериализатор и создать свой объект:
Gson gson = new GsonBuilder()
.registerTypeAdapter(MyPojo.class, new MyDeserializer())
.build();
MyPojo mp = gson.fromJson(json, MyPojo.class);
Если a
, b
т.д. Важны... ну, вам придется это понять. Но вышесказанное должно помочь вам понять, что будет необходимо для работы с вашей структурой JSON.
Для полной полноты единственного "хакерского" способа обойти это, если существует довольно ограниченное число этих типов, а внутренний объект также довольно ограничен с точки зрения его полей. Вы можете создать POJO, который включает в себя все возможности:
class MyPojo
{
MySecondPojo a;
MySecondPojo b;
...
MySecondPojo f;
}
class MySecondPojo
{
String userId;
String address;
...
String someOtherField;
}
Когда Gson десериализует JSON, он установит любые отсутствующие поля в POJO (s) равными null
. Теперь у вас может быть tr
List
или массив из них в вашем POJO. Опять же, чтобы подчеркнуть, это действительно довольно хакерский и неправильный способ сделать это, но я думал, что объясню, что потребуется для прямого анализа этого массива.