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

我的要求是解析大量后端响应,这些响应可以是 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 解析器。但是,似乎所有人都必须提前知道后端响应。


跃然一笑
浏览 153回答 2
2回答

智慧大石

另一位海报已经指出了杰克逊图书馆,但我想补充一下我的想法:Jackson 能够将 a&nbsp;String(或任何其他几个 I/O 源)直接解析为JsonNode:String&nbsp;json&nbsp;=&nbsp;backEndProvider.fetch();&nbsp;//&nbsp;example&nbsp;call JsonNode&nbsp;node&nbsp;=&nbsp;new&nbsp;ObjectMapper().readTree(json);然后,您可以JsonNode使用其.get()方法访问结果的子项:JsonNode&nbsp;child&nbsp;=&nbsp;node.get("childKey");此外,可以使用多种转换方法访问终端值。例如,如果您知道child是文本,则可以child通过以下方式获取 的值:String&nbsp;childValue&nbsp;=&nbsp;child.asText();另请参阅这篇 Baeldung 文章。从这里,您可以将用户的输入字符串(比如Employee.details.referenced[0].type)解析为键数组(例如["Employee", "details", "referenced[0]", "type"])并递归访问您的根元素,直到您获取足够的值,并在每个阶段检查键是否为数组访问操作。如果您没有任何类型信息,则需要从您的参考解析器返回 aJsonNode或 an 。Object对于诸如 之类的数组访问,referenced[0]请注意ArrayNodeinhertitsObjectNode及其方法被覆盖以使用.get()int请注意,上面的解决方案与 Jackson 的XmlMapper.

神不在的星期二

Jackson可以将 JSON 和 XML 解析为Map<String, Object>.&nbsp;值是类型化的Object,因为除了String属性之外,它可以是List或者也Map可以代表 JSON/XML 子树
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java