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

时间:2015-10-19 18:53:26

标签: java json fasterxml

给定一个JSON字段名称,例如" my_field"和一个FasterXML JSON ObjectNode,我如何通过JSON并获得所有“#34; 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对象上容易出现堆栈溢出。

1 个答案:

答案 0 :(得分:1)

这个主要:

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在引擎盖下使用了杰克逊。