【问题标题】:Deserializing a JSON in Java which contains __type instead of @class在 Java 中反序列化包含 __type 而不是 @class 的 JSON
【发布时间】:2020-04-14 20:52:21
【问题描述】:

我正在处理一个 JSON,它看起来像这样:

 "locale": {
    "__type": "com.package1.package2.className",
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
                    }

之前,我曾经得到以下 JSON:

 "locale": {
    "@class": "com.package1.package2#<className>",
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
                    }

现在,在下游服务中发生更改之前,我能够反序列化 json 并将这些值映射到类,但现在由于 @class 已替换为 __type,反序列化器无法正常工作。

如何将 __type 转换为 @class。

我不想使用替换功能,因为 JSON 比上面显示的要复杂得多,也因为它非常 hacky。有没有一个图书馆可以自己做到这一点?我无法控制收到的 JSON。

我不想为此编写自己的 POJO,因为它已经在不同的包中可用,但它的参数是 className 而不是 __type。

【问题讨论】:

  • 不是答案,只是为了检查。您有准备反序列化的类的白名单,对吗?不只是任何你无法控制的 JSON 请求的任意类?
  • 是 __type 只包含简单的类名吗?例如日期? (而不是例如 java.util.Date)。如果是这样,那么整个事情是不可能的,因为您的类路径上可能有许多具有相同简单名称的类
  • @RichardTingle 是的,我有想要反序列化的
  • @RichardTingle __type 包含整个类路径。已更新问题以反映相同的情况。
  • 你能在这里分享你的 POJO

标签: java json serialization jackson deserialization


【解决方案1】:

没有看到您的反序列化器,我无法弄清楚它为什么不起作用。但是,如果您可以为此创建自己的 POJO,使用@JsonAlias(在杰克逊)会容易得多。

POJO

class MyPojo {
    private Locale locale;

    //general getters and setters
}

class Locale {
    @JsonAlias({"__type", "@class"})
    private String typeOrClass;

    private String key1;
    private String key2;
    private String key3;

    //general getters and setters
}

代码 sn-p

ObjectMapper mapper = new ObjectMapper();
MyPojo myPojo = mapper.readValue(jsonStr, MyPojo.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多