Gson - 反序列化未知类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gson - 反序列化未知类相关的知识,希望对你有一定的参考价值。
假设我有一组A,B,C类:
公共类A:int号;
公共类B:int号;字符串地址;
public class C:int orderNumber;
我如何反序列化只包含这些类的Json字符串,但是以未知的顺序(在Java中使用Gson)?例如:
{//A
"number" : 3
}
//C
{
"orderNumber": 10
}
//B
{
"number" : 5
"address" : "New York"
}
//C
{
"orderNumber": 1
}
非常感谢你!
答案
如果您有更多具有更多字段的复杂类,那么这通常不是通用的,或者无论如何都是一个很好的策略。
但是,如果要反序列化的类与您提供的类一样简单,那么创建一个包含所有这些字段的类
@Getter
public class Z {
private Integer orderNumber;
private Integer number;
private String address;
}
你会得到一个Z
s列表,根据null
或null
你可以 - 如果需要 - 后来从A
构建B
,C
或Z
。
如果要反序列化的类更复杂,那么无论如何你需要创建某种机制来确定要解析和返回的类。它可能像评论中建议的用户1516873
Collection<Map<String,String>>
因此,对于每个项目,您需要根据该地图中的哪些字段确定要构建的类 - A
,B
或C
- item。
另一答案
如果像他说的那样,你的课程很简单,就像你提供的那样,pirho的回答很简单。但如果情况并非如此,您可以编写自己的反序列化程序。
public class PayloadJsonDeserializer implements JsonDeserializer {
@Override
public Object deserialize(JsonElement elm, Type type, JsonDeserializationContext context) throws JsonParseException {
// create java objects based on the properties in the json object
JsonPrimitive orderNumber = elm.getAsJsonObject().getAsJsonPrimitive("orderNumber");
if(!orderNumber.isJsonNull()) {
return new C(orderNumber.getAsInt());
}
return null;
}
}
使用Gson注册自定义反序列化器。
GsonBuilder gsonBuilder = new GsonBuilder()
.registerTypeAdapter(PayloadJson.class, new PayloadJsonDeserializer());
Gson gson = gsonBuilder.create();
用它来反序列化你的json。
gson.fromJson(jsonString, PayloadJson[].class);
以上是关于Gson - 反序列化未知类的主要内容,如果未能解决你的问题,请参考以下文章