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

你会得到一个Zs列表,根据nullnull你可以 - 如果需要 - 后来从A构建BCZ

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

Collection<Map<String,String>>

因此,对于每个项目,您需要根据该地图中的哪些字段确定要构建的类 - ABC - 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 - 反序列化未知类的主要内容,如果未能解决你的问题,请参考以下文章

Gson将类序列化和反序列化

如何实现 Gson 序列化/反序列化过程中 过滤指定字段

Gson反序列化泛型类型适配器的基类

如何使用 Gson @SerializedName 注释在 Kotlin 中反序列化嵌套的 Json API 响应

原始类型和数组的 GSON 自定义反序列化器

使用 gson 反序列化时将 TypeToken 转换为 Type 时出错