为了账号安全,请及时绑定邮箱和手机立即绑定

使用 java 在没有 pojo 的情况下使用给定的键解析复杂的 json 和 xml

使用 java 在没有 pojo 的情况下使用给定的键解析复杂的 json 和 xml

跃然一笑 2022-12-07 14:58:10
我的要求是解析大量后端响应,这些响应可以是 json 或 xml。我现在不知道他们的反应结构。所以,我必须以这样的方式编写一个 Java 工具,我的工具应该能够根据配置文件解析响应,这将由服务团队在运行我的工具之前进行配置,因为他们将到达知道这些值,他们将不得不通过我的工具检索。例如,如果后端 json 或 xml 响应如下所示,并且我的配置为 Employee.details.referenced[0].type,则通过工具检索的值应该是“客户支持”。我将无法使用 pojo 之类的东西,它与后端响应耦合,因为我不知道后端响应,我的同一个工具应该适用于不同的后端,它们以不同的结构输出响应:杰森:{    "Employee": [        {            "id": "12345678",            "service": "ps",            "origin": {                "address": {                    "addressLocality": "India"                }            },            "destination": {                "address": {                    "addressLocality": "US"                }            },            "status": {                "timestamp": "2019-01-29T21:02:49Z",                "location": {                    "address": {                        "addressLocality": "Germany"                    }                },                "Code": "xyz",                "description": "Services"            },            "details": {                "references": [                    {                        "number": "0003030891",                        "type": "customer-support"                    }                ]            }        }    ]}XML:<?xml version="1.0" encoding="UTF-8"?><root>   <Employee>      <element>         <destination>            <address>               <addressLocality>US</addressLocality>            </address>         </destination>         <details>            <references>               <element>                  <number>0003030891</number>                  <type>customer-support</type>               </element>            </references>         </details>         <id>12345678</id>         <origin>            <address>               <addressLocality>India</addressLocality>            </address>我试图检查 java 和 xml saxparser 中的 json 解析器。但是,似乎所有人都必须提前知道后端响应。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

另一位海报已经指出了杰克逊图书馆,但我想补充一下我的想法:

Jackson 能够将 a String(或任何其他几个 I/O 源)直接解析为JsonNode

String json = backEndProvider.fetch(); // example call
JsonNode node = new ObjectMapper().readTree(json);

然后,您可以JsonNode使用其.get()方法访问结果的子项:

JsonNode child = node.get("childKey");

此外,可以使用多种转换方法访问终端值。例如,如果您知道child是文本,则可以child通过以下方式获取 的值:

String childValue = child.asText();

另请参阅这篇 Baeldung 文章

从这里,您可以将用户的输入字符串(比如Employee.details.referenced[0].type)解析为键数组(例如["Employee", "details", "referenced[0]", "type"])并递归访问您的根元素,直到您获取足够的值,并在每个阶段检查键是否为数组访问操作。如果您没有任何类型信息,则需要从您的参考解析器返回 aJsonNode或 an 。Object

对于诸如 之类的数组访问referenced[0]请注意ArrayNodeinhertitsObjectNode及其方法被覆盖以使用.get()int

请注意,上面的解决方案与 Jackson 的XmlMapper.


查看完整回答
反对 回复 2022-12-07
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

Jackson可以将 JSON 和 XML 解析为Map<String, Object>. 值是类型化的Object,因为除了String属性之外,它可以是List或者也Map可以代表 JSON/XML 子树



查看完整回答
反对 回复 2022-12-07
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号