如何使用 Java 访问 JSON 中的三重嵌套值?
How do I access triple nested values in JSON using Java?
我正在尝试访问下面 JSON 中的“文本”值并使用这些值创建一个 ArrayList。我将如何处理?我正在尝试使用 com.fasterxml.jackson.
{
"searchApiFormatVersion": "1.0",
"searchName": "SalaryAccessRole",
"description": "",
"totalRowCount": "2",
"returnedRowCount": "2",
"startingReturnedRowNumber": "1",
"basetype": "Person",
"columnCount": "1",
"columnHeaders": [
{
"text": "EMPLID",
"dataType": "string"
}
],
"resultSet": {
"rows": [
{
"values": [
{
"text": "2270127",
"dataType": "string",
"columnHeader": "EMPLID"
}
]
},
{
"values": [
{
"text": "1050518",
"dataType": "string",
"columnHeader": "EMPLID"
}
]
}
]
}
}
我已成功使用它来搜索名称,但我正在尝试获取 resultSet->rows->values->text 下的文本。
JsonNode salaryExcludePersonNode = new ObjectMapper().readTree(sourceJson);
String person = salaryExcludePersonNode.get("searchName").textValue();//this works
String person2 = salaryExcludePersonNode.get("resultSet")
.get("rows")
.get("values")
.get("text")
.textValue());//this says that com.fasterxml.jackson.databind.JsonNode.get(String) is null
我知道您将这个问题标记为 Jackson 问题,但我认为 JSONPath 可能很适合这里。
JSONPath 库可作为 Maven 依赖项使用:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.7.0</version>
</dependency>
对于您问题中的 JSON,可以使用单个 JSON 路径选择器选择所有“文本”值:
$.resultSet.rows..text
$
- 从 JSON.
的根开始
.resultSet.rows
- 导航到 rows
数组。
..text
- 递归查找所有 text
条目。
结果自动添加到Java List
:
String jsonAsString = "{...}";
List<String> textList = JsonPath.read(jsonAsString, "$.resultSet.rows..text");
您也可以直接从 java.io.File
读取:
File jsonFile = "/your/path/to/file.json";
List<String> textList = JsonPath.read(jsonFile, "$.resultSet.rows..text");
该列表将填充 2 个条目:
2270127
1050518
参考文献:
我正在尝试访问下面 JSON 中的“文本”值并使用这些值创建一个 ArrayList。我将如何处理?我正在尝试使用 com.fasterxml.jackson.
{
"searchApiFormatVersion": "1.0",
"searchName": "SalaryAccessRole",
"description": "",
"totalRowCount": "2",
"returnedRowCount": "2",
"startingReturnedRowNumber": "1",
"basetype": "Person",
"columnCount": "1",
"columnHeaders": [
{
"text": "EMPLID",
"dataType": "string"
}
],
"resultSet": {
"rows": [
{
"values": [
{
"text": "2270127",
"dataType": "string",
"columnHeader": "EMPLID"
}
]
},
{
"values": [
{
"text": "1050518",
"dataType": "string",
"columnHeader": "EMPLID"
}
]
}
]
}
}
我已成功使用它来搜索名称,但我正在尝试获取 resultSet->rows->values->text 下的文本。
JsonNode salaryExcludePersonNode = new ObjectMapper().readTree(sourceJson);
String person = salaryExcludePersonNode.get("searchName").textValue();//this works
String person2 = salaryExcludePersonNode.get("resultSet")
.get("rows")
.get("values")
.get("text")
.textValue());//this says that com.fasterxml.jackson.databind.JsonNode.get(String) is null
我知道您将这个问题标记为 Jackson 问题,但我认为 JSONPath 可能很适合这里。
JSONPath 库可作为 Maven 依赖项使用:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.7.0</version>
</dependency>
对于您问题中的 JSON,可以使用单个 JSON 路径选择器选择所有“文本”值:
$.resultSet.rows..text
$
- 从 JSON.
.resultSet.rows
- 导航到 rows
数组。
..text
- 递归查找所有 text
条目。
结果自动添加到Java List
:
String jsonAsString = "{...}";
List<String> textList = JsonPath.read(jsonAsString, "$.resultSet.rows..text");
您也可以直接从 java.io.File
读取:
File jsonFile = "/your/path/to/file.json";
List<String> textList = JsonPath.read(jsonFile, "$.resultSet.rows..text");
该列表将填充 2 个条目:
2270127
1050518
参考文献: