サーバーの JSON 応答を GSON ライブラリで解析します。バックエンドの担当者から、「何らかの理由で 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();