如何使用 FasterXML 获取出现 JSON 字段的所有位置的完整路径?

How do I get the full path of everywhere a JSON field occurs using FasterXML?

给定一个 JSON 字段名称,例如 "my_field" 和一个 FasterXML JSON ObjectNode,我如何遍历 JSON 并获得无处不在的完全限定路径"my_field" 出现在 JSON?

"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_field 开始向下走,在我走的时候向下传递每个对象,但这很容易在大的 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);
        }
    }
}

将准确输出

$['top_field']['mid_field'][0]['my_field']
$['top_field']['mid_field'][1]['my_field']
$['top_field']['another_mid_field'][0]['my_field']

如果您对那个进行一些简单的字符串替换,我认为这是一个不错且简单的解决方案。我不确定你是否可以用普通 Jackson/FasterXML 得到类似的东西。 JsonPath 在后台使用 Jackson。