Java Jackson——使用xpath或类似的方法解析json

Java Jackson——使用xpath或类似的方法解析json,java,json,jackson,jira,jackson2,Java,Json,Jackson,Jira,Jackson2,我有一些json,它相当复杂(使用gson之类的东西建模有点太复杂和开放),我需要将某些节点的字符串值提取到字符串列表中 下面的代码可以工作,但由于我的json的工作方式——它获取了很多我不想要的额外内容(注意:我不拥有json模式) 断言: 我始终希望提取问题[x]。键,而不是任何子键。我更愿意将其提取到列表中,但任何正常的数据结构都可以。我已经在使用Jackson了——但如果有一种明智的方法,gson也是一种选择 谢谢你的帮助 公共类导出过滤器{ public class ExportFil

我有一些json,它相当复杂(使用gson之类的东西建模有点太复杂和开放),我需要将某些节点的字符串值提取到字符串列表中

下面的代码可以工作,但由于我的json的工作方式——它获取了很多我不想要的额外内容(注意:我不拥有json模式)

断言: 我始终希望提取问题[x]。键,而不是任何子键。我更愿意将其提取到列表中,但任何正常的数据结构都可以。我已经在使用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());
    }

 }
私有静态最终字符串KEY=“KEY”; 私有列表问题=新建ArrayList(); //接球手和接球手 @杰索尼奥雷 公共列表getKeys(){ 返回问题。stream() .map(问题->问题.获取(关键)) .filter(对象::非空) .map(对象::toString) .collect(toList()); } }
用法示例:

 ObjectMapper objectMapper = new ObjectMapper();
 List<String> keys = objectMapper.readValue( .., ExportFilter.class).getKeys();
ObjectMapper ObjectMapper=new ObjectMapper();
List keys=objectMapper.readValue(..,ExportFilter.class).getKeys();

JsonPath是json的xpath,它有一个。 下面是一个在没有子键的情况下获取问题键的工作示例:

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();
        }
    }
}
导入com.jayway.jsonpath.Configuration;
导入com.jayway.jsonpath.jsonpath;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.util.List;
公共类JsonPathTest{
公共静态字符串ROOT\u ARRAY=“issues”;
公共静态字符串KEY=“KEY”;
//获取根数组下的所有键
公共静态字符串jsonPath=String.format($。%s[*].%s),根数组,键);
公共静态void main(字符串[]args){
试一试{
String jsonStr=新字符串(Files.readAllBytes(path.get(“c:/temp/xx.json”));
Object jsonObj=Configuration.defaultConfiguration().jsonProvider().parse(jsonStr);
List key=JsonPath.parse(jsonObj.read)(JsonPath);
系统输出打印项次(按键);
}捕获(例外e){
e、 printStackTrace();
}
}
}
 ObjectMapper objectMapper = new ObjectMapper();
 List<String> keys = objectMapper.readValue( .., ExportFilter.class).getKeys();
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();
        }
    }
}