Jackson JSON Java嵌套对象和数组
我有一个嵌套json对象示例,如下所示: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
{
"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里找东西。我找到了答案。我将把解决方案放在这里。谢谢,很好。你给我介绍了一些新功能,我以为我什么都知道:)很高兴它很有用:)