jackson xml 列出了识别为重复键的反序列化

2023-11-20

我正在尝试使用将 xml 转换为 jsonjackson-2.5.1 and jackson-dataformat-xml-2.5.1
xml结构是从Web服务器接收的并且未知,因此我不能用java类来表示该对象,并且我试图直接转换为TreeNode using ObjectMapper.readTree.
我的问题是杰克逊无法解析列表。它只需要列表的最后一项。
code:

String xml = "<root><name>john</name><list><item>val1</item>val2<item>val3</item></list></root>";
XmlMapper xmlMapper = new XmlMapper();
JsonNode jsonResult = xmlMapper.readTree(xml);

json结果:

{"name":"john","list":{"item":"val3"}}  

如果我启用重复键失败xmlMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY),抛出异常:
com.fasterxml.jackson.databind.JsonMappingException: Duplicate field 'item' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled

有什么功能可以解决这个问题吗?有没有办法让我编写自定义反序列化器,在出现重复键时将它们转换为数组?


我使用这种方法:

  1. 插件一串行器 into Xml映射器用一个番石榴多重地图。这会将所有内容放入列表中。
  2. 使用写出jsonSerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED。这将打开所有列表size==1.

这是我的代码:

    @Test
    public void xmlToJson() {
        String xml = "<root><name>john</name><list><item>val1</item>val2<item>val3</item></list></root>";
        Map<String, Object> jsonResult = readXmlToMap(xml);
        String jsonString = toString(jsonResult);
        System.out.println(jsonString);
    }

    private Map<String, Object> readXmlToMap(String xml) {
        try {
            ObjectMapper xmlMapper = new XmlMapper();
            xmlMapper.registerModule(new SimpleModule().addDeserializer(Object.class, new UntypedObjectDeserializer() {
                @SuppressWarnings({ "unchecked", "rawtypes" })
                @Override
                protected Map<String, Object> mapObject(JsonParser jp, DeserializationContext ctxt) throws IOException {
                    JsonToken t = jp.getCurrentToken();

                    Multimap<String, Object> result = ArrayListMultimap.create();
                    if (t == JsonToken.START_OBJECT) {
                        t = jp.nextToken();
                    }
                    if (t == JsonToken.END_OBJECT) {
                        return (Map) result.asMap();
                    }
                    do {
                        String fieldName = jp.getCurrentName();
                        jp.nextToken();
                        result.put(fieldName, deserialize(jp, ctxt));
                    } while (jp.nextToken() != JsonToken.END_OBJECT);

                    return (Map) result.asMap();
                }
            }));
            return (Map) xmlMapper.readValue(xml, Object.class);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    static public String toString(Object obj) {
        try {
            ObjectMapper jsonMapper = new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true)
                    .configure(SerializationFeature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED, true);
            StringWriter w = new StringWriter();
            jsonMapper.writeValue(w, obj);
            return w.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

它打印

{
  "list" : {
    "item" : [ "val1", "val3" ]
  },
  "name" : "john"
}

总而言之,它是这种方法的一个变体,它没有番石榴多重映射:https://github.com/DinoChiesa/deserialize-xml-arrays-jackson

这里使用相同的方法:Jackson:使用列表反序列化将 XML 映射到地图

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

jackson xml 列出了识别为重复键的反序列化 的相关文章

  • 如何在 Java 中以编程方式启动和停止 Amazon EC2 实例

    如何启动和停止亚马逊EC2在java中以编程方式使用aws sdk实例 非常感谢任何帮助 因为我花了一天时间试图解决这个问题 我最近在Bamboo AWS 插件 它是开源的并且代码可在 Bitbucket 上找到 您可以找到如何启动 停止
  • Java - 正斜杠转义字符

    谁能告诉我如何在 Java 中使用正斜杠转义字符 我知道反斜杠是 但我尝试过 和 但没有成功 这是我的代码 public boolean checkDate String dateToCheck if dateToCheck matches
  • 等待/通知和等待/中断有什么区别?

    synchronized Foo class while someCondition try Foo class wait catch InterruptedException e e printStackTrace 看来这个线程在其他线程
  • 从java确定linux版本

    我想知道是否有办法从 JVM 中确定我正在运行的 Linux 版本 即区分 RHEL4 RHEL5 我只是在寻找一种一致的方法来区分操作系统及其版本 JVM 通过以下方式为您提供有关操作系统的一些基本信息 System getPropert
  • Java,使用 Scanner 进行 try-catch

    我正在创建一个小算法 这是其中的一部分 如果用户输入非整数值 我想输出一条消息并让用户再次输入数字 boolean wenttocatch do try wenttocatch false number of rigons sc nextI
  • 如何在基于 Ubuntu 的 Linux 上安装 SIGAR?

    我在一个带有 Maven 和 Spring 的 java 项目中使用 SIGAR 我的 Maven 依赖项和 Maven 存储库包含在我的pom xml文件 如以下链接所述 http mavenhub com mvn thirdparty
  • 在C#中,如何获取空白的XML节点值?

    我有一个 XML 节点 其值为空格 例子
  • 从列表中删除项目[重复]

    这个问题在这里已经有答案了 在循环列表时 我想根据条件删除列表中的项目 请参阅下面的代码 这给了我一个ConcurrentModification例外 for Object a list if a getXXX equalsIgnoreCa
  • SpringMVC Websockets 使用 Spring Security 进行用户身份验证消息传递

    我看过一些关于这个问题的帖子 但似乎没有一个真正直接回答这个问题 背景 我安装了 spring security 工作正常 并且在应用程序的其他部分顺利运行 我的用户名是 开发者 在 Java 7 Glassfish 4 Spring 4
  • 如何以 ArrayList 形式检索 JDBC 结果集?

    我正在执行一个查询来检索大量 ID 整数 有没有某种方法可以简单地以 ArrayList 形式检索所有内容 而不是在 ResultSet 中迭代数百万次并将所有内容一一复制到 ArrayList 中 我知道 ResultSet 应该被迭代
  • 错误:缺少 JavaFX 运行时组件,并且需要在 Eclipse 中运行此应用程序

    我是 JavaFX 的初学者 并尝试在 Ubuntu 上的 Eclipse 中运行 JavaFX 我的电脑上安装了 openjfx 但出现错误 JavaFX 运行时组件缺失 并且需要运行该应用程序 我已经搜索了很多但没有得到任何解决方案 尝
  • 和 <%@ include file=...> 有什么区别? [复制]

    这个问题在这里已经有答案了 这两个标签都包含一个页面中另一页面的内容 那么什么是精确差异在这两个标签之间 在一段可重用的代码中 我使用指示 在第二个我使用标准动作
  • @Transient 在休眠状态下不工作

    我正在使用休眠4 1 9 我的代码是 Transient private String ldapIdTemp 包是 import javax persistence Transient 仍在休眠查询中 它不起作用并将属性放入查询中 查询片段
  • 子类中Java静态块的执行

    我正在准备 Java 认证测试 我发现了一个与 Java 静态块执行相关的有趣问题 我花了很多时间阅读这个主题 但没有找到我正在寻找的答案 我知道静态块是在类加载到 JVM 中或调用 main 方法时执行的 但是 package oneCl
  • 禁用 JVM 上的本地 JMX 连接

    我们正在编写一个在内存中保存密码的java程序 不幸的是 用户可以轻松地使用 jconsole 或 jmap 创建堆转储文件并打开它来查找密码 我认为 jconsole 使用本地套接字连接 jvm 我想知道 有什么方法可以禁用本地用户的 j
  • 估计文件是否为 MIME 类型

    此方法应该检查文件是否为 MIME 类型 为了实现这个目标我正在使用方法探针内容类型 然而 也许是决定同一问题的另一种方式 还有哪些其他选择 如果有的话 Code class ProbeContentTypeCheker implement
  • 以编程方式更改联系人图片

    我有一张照片 存储在 Android 手机中 我希望能够更改联系人的图片 到目前为止 我所做的是启动联系人选择器 让用户选择一个联系人 然后获取所选联系人的 URI 从这个联系人中 我可以获取关联的 rawContact 并使用这段代码 U
  • 如何将 Java 异常信息返回到 jQuery.ajax REST 调用?

    我有一些 jQuery 代码 可以对 Java 后端进行 REST 调用 后端函数的处理可能会遇到异常 将此信息返回到 Javascript 的最佳方法是什么 在测试中 我捕获了 Java 中的异常并将 HTTP 状态代码设置为 500 这
  • 如何使用 Java 计算 Selenium WebDriver 中选择下拉框中的选项数量?

    我有选择下拉列表 xpath id ddlTablePay 我需要计算这个下拉列表中的选项数量 谢谢 Use getOptions 方法并将它们存储在一个列表中 然后找到它的大小 Select se new Select driver fi
  • 强参数和json输入rails 4

    我正在尝试通过 JSON 字符串保存数据 其中嵌套了关联属性 我不想使用 attr accessible 我几乎掌握了强参数的逻辑 但仍然遇到使它们工作的问题 我正在获取 JSON 字符串并使用它来保存数据 data request bod

随机推荐

  • 使用 NUnit Console Runner 运行文件夹下的所有测试

    我正在尝试使用 NUnit Runners 2 6 4 运行测试文件夹中的所有测试程序集 我当前的命令如下所示 nologo noshadow framework net 4 0 xml test TestResults xml test
  • 具有两条二次曲线的画布剪辑图像

    我只是想将图像剪辑成曲线 但没有发生这种情况 仅显示图像 但不显示剪辑 var canvas document getElementById leaf var context canvas getContext 2d save allows
  • 如何覆盖活动记录对象中的属性分配?

    我知道您可以使用虚拟属性来做到这一点 但是如果该列确实存在怎么办 例如 我的模型有一个raw topic柱子 什么时候raw topic已定 我想要artist and song title设定基于raw topic的内容 理想情况下 我想
  • C# 释放 IntPtr 引用的内存

    我正在使用一些非托管代码 它们返回指向大图像对象的指针 IntPtr 我使用引用 但在完成图像后 我需要释放指针引用的内存 目前 释放内存的唯一方法是关闭我的整个应用程序 我需要能够从应用程序内部释放该内存 这是分配内存的调用 hbitma
  • 从 DLL 导出 MFC 对话框

    7月21日 更新 见底部 在 VC 2005 中我有 2 个项目 首先 一个 MFC DLL 项目 不是扩展 DLL 它有一个简单的对话框 测试Dlg h pragma once include afxwin h include resou
  • 如何使用 xslt 管理微数据?

    我正在尝试添加一个标签 例如 div 在我的 xslt 转换中 但出现错误 预期的标记是 我正在 C net 4 0 xslt 1 0 中工作 XSLT 针对生成 XML 输出进行了优化 一般来说 HTML5 不是 XML 语法 div 显
  • 如何使用来自 python 的请求使用 opencv 从 url 打开图像

    我正在尝试在 python 上使用 OpenCV 打开大量图像 因为我需要稍后使用它们 其实 我可以用这样的枕头来实现这个目标 url r https i imgur com DrjBucJ png response requests ge
  • 使用 MySQL C API 和 C++ 获取 MySQL 数据库表中的行

    当尝试使用 C 和 MySQL C API 获取 mysql 中的表行时 我感到很困惑 我可以在 PHP 中轻松完成 只是因为 C 是一种强类型语言 所以我们还需要处理脏过程 这就是我在 PHP 中完成的方法 data array i 0
  • 无法升级或从系统中删除 firebase

    正如标题所示 我无法升级或以任何方式从我的系统中删除当前版本的 firebase 我不明白为什么 我使用首次启动项目时提示的 firebase 命令安装了它 符合npm install g firebase tools 在我安装了其他软件包
  • 如何在 Qt for android 中保持屏幕常亮?

    我找到了一些如何在 Java 中做到这一点的解决方案 但没有找到如何在 QML 或 Qt 中做到这一点 我知道首先我应该设置WAKE LOCK的许可AndroidManifest xml 我应该怎么做才能在运行时从 Qt 打开和关闭屏幕锁定
  • Docker 节点 alpine 8 分段错误(核心转储)

    我被这个错误困扰了一整天 当我尝试运行我的 docker 容器时 出现错误Segmentation fault core dumped 因此 为了重现此错误 我将提供我的环境和代码 下面第一个是 Dockerfile 没什么特别的 FROM
  • 没有JS的固定标题列和行的Html表格

    我目前正在尝试正确显示一种议程 该议程代表头行上的时间和头列上的不同房间 我想要有固定的标题 第一行和第一列 和一个可滚动的表格 显示房间在给定时间是否可用 经过一些研究后 我发现这个问题已经使用 jQuery 或自制 JS 脚本得到了回答
  • 角度4:从不同的组件调用方法

    我有 2 个同级组件 我正在一个组件中执行 http 请求 如果发生特定情况 它应该发出另一个在另一个组件中编写的 http 请求 所以我应该能够调用第一个组件中的方法 这是第一个组件 import Component OnInit Inj
  • 在elasticsearch中使用现有字段作为id

    今天刚开始使用elasticSearch 我想知道是否可以设置某种全局参数以始终使用文档中的某个字段作为 ID 我的 JSON 文档将始终拥有自己的唯一 ID Record ID a06b0000004SWbdAAG System Mods
  • Java 和本地数据库

    TL 博士 需要一些 Java 帮助来连接到真正的本地数据库 无法访问服务器技术 或者如果您可以编写代码 那就可以了 它所要做的就是查询数据库 MS Access 尽管可以更改 并输出一个 JSON 字符串 有关更多具体信息 请参阅 EDI
  • React Native android APK 扩展支持吗?

    我尝试搜索 React Native Android APK Expansion 但找不到任何有关它的页面 RN 支持 APK 扩展文件吗 如何在本地开发中测试它 谢谢 None
  • 在spring data elasticsearch中,聚合查询不能放在存储库实现中吗?

    我第一次使用 spring boot elasticsearch 我现在已经弄清楚如何使用 elastics java api 描述我的串行差异管道查询 正如您将在下面看到的 这个查询相当大 并且为每个对象返回多个存储桶以及每个存储桶之间的
  • 丢失密钥对后访问 EC2 实例

    几个月前 我启动了一个 EC2 实例 当时我将 pem 密钥存储在我的 PC 中 电脑崩溃后 我不得不在上面重新安装 Windows 而且我没有 pem 文件的备份 有什么方法可以让我到达 EC2 实例上的提示符 任何通过 ssh 或其他方
  • ASP.Net MVC 控制器构造函数中的会话为 null

    为什么控制器的构造函数中Session为null 可以从 Action 方法访问它 据推测 因为 MVC 路由框架负责更新控制器 所以它此时还没有 重新 实例化会话 有谁知道这是否是设计使然 如果是 为什么 我已经通过使用延迟加载模式设法规
  • jackson xml 列出了识别为重复键的反序列化

    我正在尝试使用将 xml 转换为 jsonjackson 2 5 1 and jackson dataformat xml 2 5 1xml结构是从Web服务器接收的并且未知 因此我不能用java类来表示该对象 并且我试图直接转换为Tree