2 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
一種選擇是JsonDeserializer對有問題的字段使用自定義,它可能是這樣的:
public class PersonDeSerializer implements JsonDeserializer<Person> {
@Override
public Person deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
try {
return context.deserialize(json, typeOfT);
} catch (JsonSyntaxException e) {
// return null to elave null or make whatever kind of a person
return null;
}
}
}
然后您可以設(shè)置使用該適配器反序列化的有問題的字段,例如:
public class MainModel {
private Long id;
@JsonAdapter(PersonDeSerializer.class)
private Person Person; // should be person, but is Person in JSON
}

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
您需要決定如何處理 Person 類的不同變體。這是使用com.google.gson.JsonParser執(zhí)行此操作的最簡單方法。
private void start() {
String json = "[{id:1,Person:{name:\"xyz\",age:30}},\n" +
"{id:2,Person:1}]";
HashMap<Integer, Person> map = new HashMap<>();
JsonArray items = new JsonParser().parse(json).getAsJsonArray();
items.forEach(jsonElement -> {
JsonObject jsonObject = jsonElement.getAsJsonObject();
int id = jsonObject.get("id").getAsInt();
JsonElement element = jsonObject.get("Person");
if(element.isJsonObject()){
JsonObject personObject = element.getAsJsonObject();
Person person = new Person();
person.name = personObject.get("name").getAsString();
person.age = personObject.get("age").getAsInt();
map.put(id, person);
}
else {
int personValue = element.getAsInt();
map.put(id, new Person(personValue));
}
});
for (int id : map.keySet()) {
Person person = map.get(id);
Log.d("myTag", id + ", name: " + person.name + ", age: " + person.age);
}
}
class Person{
String name;
int age;
Person(){}
Person(int personValue) {
// decide how the object should look
}
}
輸出:
1、姓名:xyz、年齡:30
2、姓名:空、年齡:0
如果您喜歡以更通用的方式工作而不用硬輸入您的字段名稱,您可以使用Gson 自定義反序列化
添加回答
舉報(bào)