java - Jackson——使用 xpath 或类似工具解析 json

标签 java json jackson jira jackson2

我有一些 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 也是一个选择。

感谢您的协助!

最佳答案

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();
        }
    }
}

关于java - Jackson——使用 xpath 或类似工具解析 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52506539/

相关文章:

java - 如何检测 Mac 是否具有来自 Java 的 Retina 显示屏?

php - 从 JSON 字符串中删除所有不必要的空格(在 PHP 中)

json - _TypeError(类型 'List<dynamic>'不是类型 'Map<String, dynamic>'的子类型)

iphone - iOS 5 JSON 分级别解析

java - 如何使用 FasterXML 库序列化 POJO 列表

java - 如何使用 Jackson 递归地修改 JsonNode 的值

java - 使用 Java 解析来自 Amazon SES 的原始电子邮件

java - Spring Boot 集成测试抛出错误并且无法在另一个 Maven 模块中获取现有 bean

java - JProgressBar 中的颜色

java - 如何使用 Jackson 序列化为 java.util.List 和 java.util.Map