2 回答
TA贡献1942条经验 获得超3个赞
一种选择是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;
}
}
}
然后您可以设置使用该适配器反序列化的有问题的字段,例如:
public class MainModel {
private Long id;
@JsonAdapter(PersonDeSerializer.class)
private Person Person; // should be person, but is Person in JSON
}
TA贡献2021条经验 获得超8个赞
您需要决定如何处理 Person 类的不同变体。这是使用com.google.gson.JsonParser执行此操作的最简单方法。
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 自定义反序列化
添加回答
举报