Java 如何使用FasterXML获取JSON字段出现的所有位置的完整路径?
给定一个JSON字段名,如“my_field”和一个FasterXML JSON ObjectNode,如何遍历JSON并获得JSON中出现“my_field”的所有位置的完全限定路径Java 如何使用FasterXML获取JSON字段出现的所有位置的完整路径?,java,json,fasterxml,Java,Json,Fasterxml,给定一个JSON字段名,如“my_field”和一个FasterXML JSON ObjectNode,如何遍历JSON并获得JSON中出现“my_field”的所有位置的完全限定路径 "top_field": { "mid_field": [ { "my_field": true, }, { "my_field": true,
"top_field": {
"mid_field": [
{
"my_field": true,
},
{
"my_field": true,
}
],
"another_mid_field": [
{
"my_field": false
}
]
}
我希望得到以下结果:
top_field.mid_field[0].my_field
top_field.mid_field[1].my_field
top_field.another_mid_field.my_field
FasterXML库中是否有一部分可以公开这些信息而不必解析JSON的所有值?我以前使用递归来实现这一点,从根top_字段开始向下遍历,在遍历时向下传递每个对象,但这很容易在大型JSON对象上发生堆栈溢出 这主要是:
package jsonpath;
import java.util.List;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.Option;
import static com.jayway.jsonpath.JsonPath.*;
public class GetPaths {
public static void main(String [] args) {
String json = "{\"top_field\": { \"mid_field\": [ { \"my_field\": true, }, { \"my_field\": true, } ], \"another_mid_field\": [ { \"my_field\": false } ] }}";
Configuration conf = Configuration.builder().options(Option.AS_PATH_LIST).build();
List<String> pathList = using(conf).parse(json).read("$..my_field");
for(String path : pathList) {
System.out.println(path);
}
}
}
如果你做一些简单的字符串替换,我认为这是一个很好的简单的解决方案。我不确定你是否能用普通的Jackson/FasterXML得到类似的东西。JsonPath在引擎盖下使用Jackson。谢谢,这太棒了!我们确实使用了JsonPath,但不幸的是,我仍然使用0.9,所以我无法使用它…我想这行“List pathList=using(conf).parse(json.read($…my_字段”)”应该是“List pathList=JsonPath.using(conf).parse(json.read($…my_字段”);”如果您不静态导入,可以。
$['top_field']['mid_field'][0]['my_field']
$['top_field']['mid_field'][1]['my_field']
$['top_field']['another_mid_field'][0]['my_field']