亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號