Jackson--使用xpath或类似方法解析json

bjg7j2ky  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(166)

我有一些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"
        }
    }
    ]
}


Assert:我总是想提取issues[x].key而不是任何子键。我更喜欢将其提取到列表中,但任何正常的数据结构都可以。我已经在使用Jackson--但如果有合理的方法,gson也是一个选择。
谢谢你的帮助!

m4pnthwp

m4pnthwp1#

JsonPath是json的xpath,它有一个Java implementation。下面是一个获取没有子键的issue键的工作示例:

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

字符串

uelo1irk

uelo1irk2#

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

a1o7rhls

a1o7rhls3#

检查JacksonatjsonPointer在这里Jackson。核心,我使用的东西如下:

JsonNode input = objectMapper.readTree(fileStream);

String device_name = input.at("/device/name").asText();

JsonNode fq_name_list = input.at("/abstract_config/fq_name");
if (fq_name_list.isMissingNode()) continue;

String fq_name = fq_name_list.get(fq_name_list.size() - 1).asText();
logger.info(" device:{} abstract_config:{}",device_name,fq_name);

字符串

相关问题