Jackson——使用 xpath 或类似工具解析 json
Jackson -- parse json using xpath or similar
我有一些 json 并且它相当复杂——(对于使用 gson 之类的东西建模来说有点过于复杂和开放),我需要从某些节点中提取字符串值到一个列表中字符串。
以下代码有效,但由于我的 json 的工作方式——它获取了很多我不想要的额外内容(注意:我不拥有 json模式)
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
List<JsonNode> keys = node.findValues("key") ;
for(JsonNode key: keys){
System.out.println(key.toString());
}
Json 的内容相当复杂(Jira 过滤器导出),如下所示:
{
"issues": [
{
"key":"MIN-123",
...
"fields":{
"key":"A_Elric"
}
}
]
}
断言:
我总是想提取 issues[x].key 而不是任何子键。我更愿意将其提取到一个列表中,但任何普通的数据结构都可以。我已经在使用 Jackson——但如果有合理的方法,gson 也是一个选择。
感谢协助!
public class ExportFilter{
private static final String KEY = "key";
private List<Map<String,Object>> issues = new ArrayList<>();
//getters and setters
@JsonIgnore
public List<String> getKeys(){
return issues.stream()
.map(issue-> issue.get(KEY))
.filter(Objects::nonNull)
.map(Objects::toString)
.collect(toList());
}
}
用法示例:
ObjectMapper objectMapper = new ObjectMapper();
List<String> keys = objectMapper.readValue( .., ExportFilter.class).getKeys();
JsonPath 是 json 的 xpath,它有一个 Java implementation。
这是一个在没有子键的情况下获取问题键的工作示例:
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class JsonPathTest {
public static String ROOT_ARRAY = "issues";
public static String KEY = "key";
// get all KEYs right under ROOT array
public static String jsonPath = String.format("$.%s[*].%s", ROOT_ARRAY, KEY);
public static void main(String[] args) {
try {
String jsonStr = new String(Files.readAllBytes(Paths.get("c:/temp/xx.json")));
Object jsonObj = Configuration.defaultConfiguration().jsonProvider().parse(jsonStr);
List<String> keys = JsonPath.parse(jsonObj).read(jsonPath);
System.out.println(keys);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我有一些 json 并且它相当复杂——(对于使用 gson 之类的东西建模来说有点过于复杂和开放),我需要从某些节点中提取字符串值到一个列表中字符串。
以下代码有效,但由于我的 json 的工作方式——它获取了很多我不想要的额外内容(注意:我不拥有 json模式)
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
List<JsonNode> keys = node.findValues("key") ;
for(JsonNode key: keys){
System.out.println(key.toString());
}
Json 的内容相当复杂(Jira 过滤器导出),如下所示:
{
"issues": [
{
"key":"MIN-123",
...
"fields":{
"key":"A_Elric"
}
}
]
}
断言: 我总是想提取 issues[x].key 而不是任何子键。我更愿意将其提取到一个列表中,但任何普通的数据结构都可以。我已经在使用 Jackson——但如果有合理的方法,gson 也是一个选择。
感谢协助!
public class ExportFilter{
private static final String KEY = "key";
private List<Map<String,Object>> issues = new ArrayList<>();
//getters and setters
@JsonIgnore
public List<String> getKeys(){
return issues.stream()
.map(issue-> issue.get(KEY))
.filter(Objects::nonNull)
.map(Objects::toString)
.collect(toList());
}
}
用法示例:
ObjectMapper objectMapper = new ObjectMapper();
List<String> keys = objectMapper.readValue( .., ExportFilter.class).getKeys();
JsonPath 是 json 的 xpath,它有一个 Java implementation。 这是一个在没有子键的情况下获取问题键的工作示例:
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
public class JsonPathTest {
public static String ROOT_ARRAY = "issues";
public static String KEY = "key";
// get all KEYs right under ROOT array
public static String jsonPath = String.format("$.%s[*].%s", ROOT_ARRAY, KEY);
public static void main(String[] args) {
try {
String jsonStr = new String(Files.readAllBytes(Paths.get("c:/temp/xx.json")));
Object jsonObj = Configuration.defaultConfiguration().jsonProvider().parse(jsonStr);
List<String> keys = JsonPath.parse(jsonObj).read(jsonPath);
System.out.println(keys);
} catch (Exception e) {
e.printStackTrace();
}
}
}