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