java - Jackson JSON Java 嵌套对象和数组

标签 java json jackson objectmapper

我有一个嵌套 json 对象的示例,如下所示:

{
"payload": {
"id": "1",
"apiResp": {
  "apiRespDetails": {
    "report": {
      "reportId": "reportid1",
      "reportDetails": [
        {
          "code": "1",
          "rating": "good"
        },
        {
          "code": "2",
          "rating": "bad"
        },
        {
          "code": "3",
          "rating": "fair"
        }
      ]
     }
   }
  }
 }
}

我只需要报表对象,不需要其父对象的任何详细信息。使用 Jackson API 实现这一点的最佳方法是什么?

我创建了一个名为 Report.java 的 Java 类,其中包含字段 reportId (String) 和 reportDetails(List of ReportDetail ),其中 ReportDetail 是另一个具有字符串字段 code 、 rating 等的类。我是否需要使用一些 Deserializer、JsonTreeParser 机制?谢谢。

最佳答案

这个问题的解决方案是jayway Java implementation for JsonPath .
JsonPathXPath 的等效 json XML 的查询语言。 查询语言非常强大,可以在 github 自述文件的示例中看到。

这里有一个快速演示,可以帮助您入门:

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import com.jayway.jsonpath.*;
import net.minidev.json.JSONArray;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.*;

public class JsonPathDemo2
{
    public static void main(String[] args)
    {
        // query: search for any report property below root 
        String jsonPathQuery = "$..report";

        try (InputStream is = Files.newInputStream(Paths.get("C://temp/xx.json"))) {
            Object parsedContent = 
                    Configuration.defaultConfiguration().jsonProvider().parse(is, StandardCharsets.UTF_8.name());
            System.out.println("hasJsonPath? " + hasJsonPath(jsonPathQuery).matches(parsedContent));
            Object obj = JsonPath.read(parsedContent, jsonPathQuery);
            System.out.println("parsed object is of type " + obj.getClass());
            System.out.println("parsed object to-string " + obj);
            JSONArray arr = (JSONArray)obj;
            System.out.println("first array item is of type " + arr.get(0).getClass());
            System.out.println("first array item to-string " + arr.get(0));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

hasJsonPath? true
parsed object is of type class net.minidev.json.JSONArray
parsed object to-string [{"reportId":"reportid1","reportDetails":[{"code":"1","rating":"good"},{"code":"2","rating":"bad"},{"code":"3","rating":"fair"}]}]
first array item is of type class java.util.LinkedHashMap
first array item to-string {reportId=reportid1, reportDetails=[{"code":"1","rating":"good"},{"code":"2","rating":"bad"},{"code":"3","rating":"fair"}]}

关于java - Jackson JSON Java 嵌套对象和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121170/

相关文章:

java - 在 Android 中使用一个元素和 ListView 向下滚动整个 Activity

jquery - 从 servlet 返回 JSON

json - 解码 map[string]interface{} 时出现 mgo 错误

java - 使用 Jackson JSON 解析将 TRUE 或 FALSE 转换为 boolean 值

java - 在 Java 中读取 YAML 文件时堆栈溢出

java - 如果我在 if 语句中检查方法是否返回 true,则方法中的实际代码会被执行吗?

java - 通过java中的命令行参数从文件读取数据,文件名密码

java - Google 搜索是否为应用程序提供 API?

java - 将根元素名称保留在 Jackson 生成的 JSON 中

json - Jackson JSON、Spring MVC 4.2 和 Hibernate JPA 问题的无限递归