我使用GSON庫解析服務器JSON響應。後端人有時會告訴我:「我們無法在某些情況下在JSON中指定變量類型」(舊的php,他們不知道如何去做,等等)。 GSON喜歡在其對象模型中強大的打字。所以我不能將Object解析爲字符串。GSON解析未指定的類型變量
GSON等待:
{
"service":{
"description":null,
"name":"Base",
"id":"4c7a90410529"
}
}
但它得到(空數據):
"service": ""
我也得到
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1396
什麼是解析這樣的反應最好的做法是什麼?
另一個問題: 我該如何構建對象,它可以識別整數或作爲字符串時不時返回的Integer變量?相同的服務器端問題。
"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();
您可以發表您正在使用的代碼反序列化這部分的JSON。 – David