jsonpath谓词过滤器在java中不起作用

时间:2017-06-03 08:18:31

标签: java json filter jsonpath

我正在使用com.jayway.jsonpath 2.2.0查看属性是否在一系列JSON记录中。

以下是正在使用的JSON记录的示例

{
    "data": 
    {
        "sampleTime": "2017-06-02T11:47:37.040Z",
        "target": 
        {
            "gateway": "TEST1",
            "probe": "zeus",
            "managedEntity": "zeus",
            "type": "",
            "sampler": "HARDWARE",
            "dataview": "HARDWARE",
            "filter": 
            {
                "osType": "Linux",
                "pluginName": "HARDWARE"
            }
        },

        "name": "cpuUtilisation",
        "row": 
        {
            "Value": "50.39 % (average load)"
        }
    },

    "operation": "update"
}

所以我想匹配osType ==' Linux',见上面的记录

我有一些代码尝试执行此操作,似乎正常工作

@Test
public void test_jsonpath_filter_find_match() throws Exception {

    // load in json record from file
    String jsonString = FileUtils.readFileToString(new File("resources/geneos-raw.table-cpuutilisation.json"), "UTF-8");

    List<Map<String, Object>> match  = JsonPath.parse(jsonString).read("$..filter", Filter.filter(Criteria.where("osType").eq("Linux")));

    System.out.println("result>" + match);
}

我打印结果似乎证明JSON记录与过滤器匹配

2017/06/03 09:01:27.216 [DEBUG][com.jayway.jsonpath.internal.path.CompiledPath]: Evaluating path: $..['filter']
result>[{"osType":"Linux","pluginName":"HARDWARE"}]

但是,如果我放置一个不匹配的过滤器,我仍会得到相同的结果。

注意osType ==&#39; Windows&#39;在过滤器

@Test
public void test_jsonpath_filter_find_match() throws Exception {

    // load in json record from file
    String jsonString = FileUtils.readFileToString(new File("resources/geneos-raw.table-cpuutilisation.json"), "UTF-8");

    List<Map<String, Object>> match  = JsonPath.parse(jsonString).read("$..filter", Filter.filter(Criteria.where("osType").eq("Windows")));

    System.out.println("result>" + match);
}

结果是匹配!

2017/06/03 09:02:06.137 [DEBUG][com.jayway.jsonpath.internal.path.CompiledPath]: Evaluating path: $..['filter']
result>[{"osType":"Linux","pluginName":"HARDWARE"}]

我相信结果应该是返回的空列表。

这是一个错误,还是我的代码/思考存在缺陷?

1 个答案:

答案 0 :(得分:0)

尝试像这样过滤:

JsonPath.parse(jsonString).read("$..filter[?(@.osType=='Windows')]");
JsonPath.parse(jsonString).read("$..filter[?(@.osType=='Linux')]");