我的要求是解析大量后端响应,这些响应可以是 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.
添加回答
举报
0/150
提交
取消
