Java Gson-反序列化未知类
假设我有一组a、B、C类: 公共A类: 整数 B类公众: 整数; 字符串地址 公共C类: int订单号 如何反序列化仅包含这些类但顺序未知的Json字符串(在Java中使用Gson)?例如:Java Gson-反序列化未知类,java,json,gson,Java,Json,Gson,假设我有一组a、B、C类: 公共A类: 整数 B类公众: 整数; 字符串地址 公共C类: int订单号 如何反序列化仅包含这些类但顺序未知的Json字符串(在Java中使用Gson)?例如: {//A "number" : 3 } //C { "orderNumber": 10 } //B { "number" : 5 "address" : "New York" } //C { "orderNumber": 1 } 多谢各位 如果您有更复杂的类和更多的字段,那么这不是一个通用的策略,或者无论
{//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
您可以(如果需要)稍后从Z
构建a
、B
或C
如果要反序列化的类更复杂,那么无论如何都需要创建某种机制来确定要解析和返回的类。这可能类似于评论中建议的用户1516873
Collection<Map<String,String>>
收藏
因此,对于每个项目,您需要通过映射中存在哪些字段来确定哪些类-
A
,B
或C
,项目将被构造。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);
我认为您应该首先将json负载转换为一个通用结构(如Jackson中的JsonNode),然后决定将其转换为哪个类