Java:具有接口属性的对象的 Jackson 多态 JSON 反序列化?

2023-11-22

我正在使用杰克逊的ObjectMapper反序列化包含接口作为其属性之一的对象的 JSON 表示形式。代码的简化版本可以在这里看到:

https://gist.github.com/sscovil/8735923

基本上,我有一个班级Asset有两个属性:type and properties。 JSON 模型如下所示:

{
    "type": "document",
    "properties": {
        "source": "foo",
        "proxy": "bar"
    }
}

The properties属性被定义为一个名为的接口AssetProperties,并且我有几个实现它的类(例如DocumentAssetProperties, ImageAssetProperties)。这个想法是图像文件具有与文档文件等不同的属性(高度、宽度)。

我已经完成了中的示例本文,阅读此处有关 SO 及其他内容的文档和问题,并在@JsonTypeInfo注释参数,但一直没能破解这个难题。任何帮助将不胜感激。

最近,我遇到的例外是:

java.lang.AssertionError: Could not deserialize JSON.
...
Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'source' into a subtype of [simple type, class AssetProperties]

提前致谢!

解决方案:

非常感谢@Michał Ziober,我能够解决这个问题。我还可以使用枚举作为类型 ID,这需要一些谷歌搜索。这是带有工作代码的更新要点:

https://gist.github.com/sscovil/8788339


你应该使用JsonTypeInfo.As.EXTERNAL_PROPERTY代替JsonTypeInfo.As.PROPERTY。在这种情况下你的Asset类应该如下所示:

class Asset {

    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = ImageAssetProperties.class, name = "image"),
        @JsonSubTypes.Type(value = DocumentAssetProperties.class, name = "document") })
    private AssetProperties properties;

    public AssetProperties getProperties() {
        return properties;
    }

    public void setProperties(AssetProperties properties) {
        this.properties = properties;
    }

    @Override
    public String toString() {
        return "Asset [properties("+properties.getClass().getSimpleName()+")=" + properties + "]";
    }
}

另请参阅我在这个问题中的回答:Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY 无法按预期工作.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:具有接口属性的对象的 Jackson 多态 JSON 反序列化? 的相关文章

随机推荐

  • 在bash shell脚本中如何将字符串转换为数字[重复]

    这个问题在这里已经有答案了 嘿我想将字符串转换为数字 x 0 80 I would like to convert x to 0 80 to compare like such if x gt 0 70 then echo x gt gt
  • 如何使用 Jackson 反序列化 JS 日期?

    我从 ExtJS 获取格式为以下的日期字符串 2011 04 08T09 00 00 当我尝试反序列化此日期时 它将时区更改为印度标准时间 为时间添加 5 30 这就是我反序列化日期的方式 SimpleDateFormat dateForm
  • npm install fsevents 错误

    你好 我正在尝试安装 fsevents whitchnpm 因此我使用以下版本 节点 4 2 6 国家公共管理 3 5 2 操作系统 Ubuntu 16 04 LTS 我正在执行该语句 Edited npm install fsevents
  • 使用仪器解决内存不足警告

    我正在尝试使用仪器来解决一些内存不足的情况 我可以看到物理内存可用监视器中的内存消耗下降到几 MB 尽管分配显示所有分配约为 3 MB 总体字节为 34 MB 自从我使用 NSOperationQueue 将一些操作移动到单独的线程后 我就
  • NHibernate无状态会话插入速度慢

    这几天我一直致力于提高 NHibernate 插入性能 我读过很多帖子 例如this one that 无状态会话每秒可以插入 1000 2000 条记录 但是 它可以插入 1243 条记录的最佳时间对我来说超过 9 秒 var sessi
  • smtp;550 访问被拒绝 - HELO 名称无效(请参阅 RFC2821 4.1.1.1)

    我正在运行 Windows Server 2008 R2 但我收到一些域拒绝的 smtp 邮件 为了测试它 我将一个文本文件放入 C inetpub mailroot Pickup 目录中 内容如下 From email protected
  • 带有双引号参数的 exec

    我想执行findWindows 命令使用exec包 但 Windows 正在做一些奇怪的转义 我有类似的东西 out err exec Command find SomeText Output 但这会引发错误 因为 Windows 正在将其
  • 将分数转换为 html 实体[重​​复]

    这个问题在这里已经有答案了 我们在数据库中存储了一些分数信息 例如3 4 5 除了进行搜索和替换之外 是否有任何内置 PHP 函数可以自动将它们转换为正确的 html 实体 您可以使用htmlentities 函数 这会将所有特殊字符替换为
  • 检测用户何时关闭软键盘

    我的视图中有一个 EditText 小部件 当用户选择 EditText 小部件时 我会显示一些说明并出现软键盘 我使用 OnEditorActionListener 来检测用户何时完成文本输入 然后关闭键盘 隐藏指令并执行某些操作 我的问
  • 有什么方法可以知道 php 脚本是否在 cli 模式下运行?

    或者反过来 有没有办法知道 php 脚本是否正在 Web 服务器内运行 http www php net manual en function php sapi name php function is cli return php sap
  • Java 客户端应用程序中的 Ajax 调用 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Servlet 和 Ajax 我在 Javascript 中使用以下代码来进行 Ajax 调用 function getPersonDataFromServer ajax type POST
  • 为什么 Node.js 一次只处理六个请求?

    我们有一个 Node js 服务器 它实现了 REST API 作为中央服务器的代理 而中央服务器的 REST API 略有不同 而且不幸的是不对称 我们的客户端运行在各种浏览器中 要求节点服务器从中央服务器获取任务 节点服务器从中央服务器
  • 将范围变量连接到角度指令表达式中的字符串中

    我在 Angular ng click 指令中使用作用域方法 如下所示 a obj val1 obj val2 a 这里的问题是 obj val1 和 obj val2 被解释为传递给表达式中的方法的字符串的一部分 我需要将它们作为变量进行
  • Java方法使用反射分配对象字段值

    我想知道 Java 中是否可以有类似下面的内容 public class MyClass private String name private Integer age private Date dateOfBirth constructo
  • 如何自动回答 y(kill-matching-buffers 询问我是否应该终止修改的缓冲区)?

    在 Emacs 中 如何杀死与正则表达式匹配的缓冲区 Edit 我该如何回答y自动地 kill matching buffers询问我是否应该杀死修改过的缓冲区 像这样的东西吗 defun bk kill buffers bfrRgxp i
  • 使用 React Router 进行条件渲染

    我想在顶部渲染一些带有导航的路线 而在没有任何导航的情况下渲染其他路线 如注册 登录页面 对于导航的设置 我有 const App gt
  • 从类路径中的任何位置加载资源

    我有一个简单的 java 应用程序 它从当前包加载属性文件 this getClass getResourceAsStream props properties 当我想要的属性文件位于当前包中时 这可以正常工作 但是 我想将此应用程序打包为
  • 素数生成器解释? [复制]

    这个问题在这里已经有答案了 我正在寻找一种生成素数的算法 我找到了罗伯特 威廉 汉克斯 Robert William Hanks 创作的以下一幅作品 它非常有效并且比其他算法更好 但我无法理解其背后的数学原理 def primes n Re
  • 将数组传递给 Java 方法

    如何将整个数组传递给方法 private void PassArray String arrayw new String 4 populate array PrintA arrayw private void PrintA String a
  • Java:具有接口属性的对象的 Jackson 多态 JSON 反序列化?

    我正在使用杰克逊的ObjectMapper反序列化包含接口作为其属性之一的对象的 JSON 表示形式 代码的简化版本可以在这里看到 https gist github com sscovil 8735923 基本上 我有一个班级Asset有