1) Первый вариант, не получите String
. Если номер недоступен, вы должны получить null
вместо этого. Так бы это выглядело так:
"character": {"id": null,"name": null}
Это решит проблему.
2) Второй вариант - измените модель данных, чтобы не искать Integer
, а просто Object
. Но это означает, что вам нужно больше проверок.
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private Object id;
Так что, как только вы проанализируете это так:
MyPojo pojo = gson.fromJson(jsonString, MyPojo.class);
Вам нужно будет сделать это, чтобы использовать поле id
:
if(pojo.getId() instanceof Integer) {
// you know you have a number
} else if (pojo.getId() instanceof String) {
// you know it's not a valid number
}
Вот и все!
3) третий вариант: две модели данных.
Первый для Integer
:
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private Integer id;
Второй для String
:
@SerializedName("name")
private String name;
@SerializedName(value = "id")
private String id;
Таким образом, когда вы анализируете это, вы анализируете это в JsonObject
:
JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class);
Затем проверьте, к какому из них нужно привязаться:
try {
Integer id = jsonObject.get("id").getAsInt();
// it's a number!!
MyIntegerPojo integerPojo = new Gson().fromJson(jsonObject, MyIntegerPojo.class);
} catch (ClassCastException e) {
// it's not a number
MyStringPojo stringPojo = new Gson().fromJson(jsonObject, MyStringPojo.class);
}
Я действительно рекомендовал первый вариант - он чище, и это был бы правильный способ сделать это.