Я анализирую серверный ответ JSON с библиотекой GSON. Иногда ребята говорят мне: «Мы не можем указать тип переменной в JSON по какой-то причине» (старый php, они не знают, как это сделать и т. Д. И т. Д.). GSON любит сильную типизацию в своей объектной модели. Поэтому я не могу разобрать объект как String.GSON parsing неопределенный тип переменной
GSON ждать:
{
"service":{
"description":null,
"name":"Base",
"id":"4c7a90410529"
}
}
Но он получает (пустые данные):
"service": ""
И я получаю
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1396
Что является лучшей практикой для анализа такого ответа?
Другой вопрос: Как я могу построить объект, он может распознавать переменную Integer, которая время от времени возвращалась как Integer или String? Тот же вопрос на стороне сервера.
"data": "1"
или
"data": 1
Я знаю - мы должны использовать определенные типы в Java. Но иногда стоит сделать уступки,
Благодаря
EDIT: Мое решение основано на ответ Java разработчика.
Класс ServiceDeserializer десериализует каждый объект в зависимости от его внутреннего значения.
public class ServiceDeserializer implements JsonDeserializer<ServiceState>{
@Override
public ServiceState deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String name = "";
String uuid = "";
String description = "";
if (json.isJsonObject()) {
JsonObject obj = json.getAsJsonObject();
if (!obj.get("name").isJsonNull()) {
name = obj.get("name").getAsString();
}
if (!obj.get("uuid").isJsonNull()) {
uuid = obj.get("uuid").getAsString();
}
if (!obj.get("description").isJsonNull()) {
description = obj.get("description").getAsString();
}
}
return new ServiceState(name, uuid, description);
}
}
И мой конструктор GSON с адаптером типа для ServiceState.
Gson gson = new GsonBuilder()
.registerTypeAdapter(ServiceState.class, new ServiceDeserializer())
.create();
Можете ли вы разместить код, который вы используете для десериализации этой части JSON. – David