我使用 GSON 库解析服务器 JSON 响应。后端人员有时会告诉我:“由于某种原因,我们无法在 JSON 中指定变量类型”(旧的 php,他们不知道该怎么做等等)。GSON 喜欢在其对象模型中使用强类型。所以我不能将对象解析为字符串。
GSON 等待:
{
"service":{
"description":null,
"name":"Base",
"id":"4c7a90410529"
}
}
但它得到(空数据):
"service": ""
我得到
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1396
解析此类响应的最佳做法是什么?
另一个问题:如何构建对象,它可以将不时返回的整数变量识别为整数或字符串?同样的服务器端问题。
"data": "1"
或者
"data": 1
我知道 - 我们应该在 Java 中使用特定类型。但有时做出让步是值得的,
谢谢
编辑:
我的解决方案基于 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);
}
}
还有我的带有 ServiceState 类型适配器的 GSON 构造函数。
Gson gson = new GsonBuilder()
.registerTypeAdapter(ServiceState.class, new ServiceDeserializer())
.create();