Gson - 反序列化未知类

时间:2017-12-25 13:09:35

标签: java json gson

假设我有一组A,B,C类:

公共课A: int number;

公共课B: int数; 字符串地址;

公共课C: int orderNumber;

如何反序列化仅包含这些类的Json字符串,但是以未知顺序(在Java中使用Gson)?例如:

{//A
"number" : 3
}
//C
{
"orderNumber": 10
}
//B
{
"number" : 5
"address" : "New York"
}
//C
{
"orderNumber": 1
}

非常感谢!

2 个答案:

答案 0 :(得分:0)

如果您有更多具有更多字段的复杂类,那么这通常不是通用的,或者无论如何都是一个很好的策略。

但是如果要反序列化的类与您提供的类一样简单,那么创建一个包含所有这些字段的类

@Getter
public class Z {
   private Integer orderNumber;
   private Integer number;
   private String address;
}

您将获得Z的列表,具体取决于nullnull哪个字段可以 - 如果需要 - 稍后构建A,{来自B的{​​1}}或C

如果要反序列化的类更复杂,那么无论如何你需要创建某种机制来确定要解析和返回的类。它可能像评论

中建议的 user1516873
Z

因此,对于每个项目,您需要根据该地图中的哪些字段确定哪个类 - Collection<Map<String,String>> AB - 项目将被构建。

答案 1 :(得分:0)

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);