Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jackson JSON Java嵌套对象和数组_Java_Json_Jackson_Objectmapper - Fatal编程技术网

Jackson JSON Java嵌套对象和数组

Jackson JSON Java嵌套对象和数组,java,json,jackson,objectmapper,Java,Json,Jackson,Objectmapper,我有一个嵌套json对象示例,如下所示: { "payload": { "id": "1", "apiResp": { "apiRespDetails": { "report": { "reportId": "reportid1", "reportDetails": [ { "code": "1", "rating": "good" }, { "code

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

{
"payload": {
"id": "1",
"apiResp": {
  "apiRespDetails": {
    "report": {
      "reportId": "reportid1",
      "reportDetails": [
        {
          "code": "1",
          "rating": "good"
        },
        {
          "code": "2",
          "rating": "bad"
        },
        {
          "code": "3",
          "rating": "fair"
        }
      ]
     }
   }
  }
 }
}
我只需要报表对象,不需要它的任何父对象详细信息。使用jacksonapi获取这些信息的最佳方式是什么

我创建了一个名为Report.Java的Java类,其中包含字段reportId(String)和reportDetails(ReportDetail列表),其中ReportDetail是另一个包含字符串字段代码、评级等的类。我需要使用一些反序列化器、JsonTreeParser机制吗?谢谢

解决方法是。
是XML查询语言的json等价物。 查询语言非常强大,正如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"}]}

Hi发现了两个使用jackson fasterxml api的解决方案

在第一种方法中,您只需在jsonNode上使用findValue方法,并传入要查找的属性/对象的字符串值

    String jsonresponse = "above json string";
    JsonFactory jsonFactory = new JsonFactory();
    JsonParser jp = jsonFactory.createParser(jsonresponse);
    jp.setCodec(new ObjectMapper());
    JsonNode jsonNode = jp.readValueAsTree();
    JsonNode reportNode = jsonNode.findValue("report");     
    ObjectMapper mapper = new ObjectMapper();
    Report report = mapper.convertValue(reportNode, Report.class);
    JsonFactory factory = new JsonFactory();       
    factory.setCodec(new ObjectMapper());
    JsonParser  parser  = factory.createParser(jsonresponse);
    while(!parser.isClosed()){
        JsonToken jsonToken = parser.nextToken();

        if(JsonToken.FIELD_NAME.equals(jsonToken)){
            String fieldName = parser.getCurrentName();
            if("report".equals(fieldName)) {
                jsonToken = parser.nextToken();
                Report report = parser.readValueAs(Report.class);       
            } else {
                jsonToken = parser.nextToken();
            }
        }
    } 
另一个解决方案使用JsonToken,它将传递json响应,直到找到所需的内容

    String jsonresponse = "above json string";
    JsonFactory jsonFactory = new JsonFactory();
    JsonParser jp = jsonFactory.createParser(jsonresponse);
    jp.setCodec(new ObjectMapper());
    JsonNode jsonNode = jp.readValueAsTree();
    JsonNode reportNode = jsonNode.findValue("report");     
    ObjectMapper mapper = new ObjectMapper();
    Report report = mapper.convertValue(reportNode, Report.class);
    JsonFactory factory = new JsonFactory();       
    factory.setCodec(new ObjectMapper());
    JsonParser  parser  = factory.createParser(jsonresponse);
    while(!parser.isClosed()){
        JsonToken jsonToken = parser.nextToken();

        if(JsonToken.FIELD_NAME.equals(jsonToken)){
            String fieldName = parser.getCurrentName();
            if("report".equals(fieldName)) {
                jsonToken = parser.nextToken();
                Report report = parser.readValueAs(Report.class);       
            } else {
                jsonToken = parser.nextToken();
            }
        }
    } 

你可以创建各自的父对象,只捕获你想要的东西。我不认为它会像那样工作。我需要为每个嵌套对象创建一个Java对象。如果有10个嵌套对象,我不想在我的类中添加这些对象的详细信息。您可以通过
@JsonProperty
捕获您正在查找的对象,并且如果您只需粘贴JSON,就可以生成所有Java对象的在线实现。你可以去掉你不想要的东西和元素,谢谢你的回复。我在杰克逊的api里找东西。我找到了答案。我将把解决方案放在这里。谢谢,很好。你给我介绍了一些新功能,我以为我什么都知道:)很高兴它很有用:)