java - 反序列化为动态 Java 类型

标签 java json gson deserialization

我今天的问题是我有这种 JSON, 具有对象数组,每个对象都有 两个属性:typevalue

[{
    "type": "Boolean",
    "value": false
}, {
    "type": "String[]",
    "value": ["one", "two", "three"]
}]

如您所见,value 类取决于type。 我可能有一个 type: MyClass,其中 value 是一个复杂的对象。

我希望能够反序列化这个数组(并将其序列化回来 之后转换为 JSON)。

我开始研究 Gson图书馆,但我可能随时改变。 根据我所读到的内容,我只知道一种方法:

public class MyExtractor implements JsonDeserializer<Object> {
    @Override
    public Object deserialize(JsonElement elem, Type jtype,
            JsonDeserializationContext jdc) throws JsonParseException {
        // elem is an object
        JsonObject obj = elem.getAsJsonObject();
        String type = obj.get("type").getAsString();
        // Return a different kind of Object depending on the 'type' attr
        switch (type) {
        case "Boolean":
            Boolean bool = obj.get("value").getAsBoolean();
            return bool;
        case "String[]":
            JsonArray data = obj.get("value").getAsJsonArray();
            List<String> list = new ArrayList<String>();
            for (JsonElement item : data) {
                list.add(item.getAsString());
            }
            return list;
        }
    }
}

在这里,我添加代码将每个类型与其正确的类相关联。 这可能会如我所愿,但有更好的方法吗? 这最终需要相当多的模板。

此外,反序列化的项目被转换为 Object 所以我不 无需读取其 getClass() 即可访问其方法,并且 将它们转换回来,我无法从 overloading 中受益.

是否存在针对该问题采取不同方法的库?

最佳答案

如果您可以更改原始 json:

[{
    "type": "Boolean",
    "value": false
}, {
    "type": "String[]",
    "value": ["one", "two", "three"]
}]

[false, ["one", "two", "three"]]

您可以简单地将其反序列化为

String jsonString = ...
Object[] result = new Gson().fromJson(jsonString, Object[].class);

这对于每个标准类型(StringBooleanInteger...)都适用,对于自定义类,它将创建一个 map


例如,如果 jsonString 有内容

["testString", false, {"name":"Davide", "surname":"Marino"}]

它将生成一个对象数组:

  • 第一个位置的String testString
  • 第二个位置的 boolean 值 false
  • 具有属性 name(值为 Davide)和 surname(值为 Marino) 第三位

如果您不需要处理现有的 java 类,但您有 3 4 个自定义类,则可以使用多态反序列化。

基本上,您需要创建一个自定义接口(interface)(或基类)并实现(或扩展)它。 要查看更完整的示例,请参阅已接受的答案

Gson serialize a list of polymorphic objects

关于java - 反序列化为动态 Java 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47141116/

相关文章:

java - http session 在request.sendRedirect后丢失属性

javascript - jQuery map 不适用于 json 数组

javascript - 如何从json中获取输入来绘制图形

ruby-on-rails - 设计 API 身份验证

java - 如何在jsonobject中设置数组

java - 在Spring中将包含json属性的实体保存到ElasticSearch

java - 安卓改造2 : read from async delayed http page

java - 如何永久缓存加载的数据(图像)?

java - 使用 putExtras 将 int 变量传递给另一个 Activity 会导致应用程序崩溃

c++ - QT中如何从json中加载base64图片数据