2017-06-03 49 views
0

我正在使用com.jayway.jsonpath 2.2.0來查看屬性是否在一系列JSON記錄中。jsonpath謂詞過濾器在java中不工作

這裏是正在使用

{ 
    "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的,在上面記錄看到一個JSON記錄的例子

我試圖做一些代碼這一點,似乎工作

@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"}] 

但是,如果我把一個不匹配的過濾器,我仍然會得到相同的結果。

注意在過濾器

@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); 
} 

而且結果OSTYPE =='Windows的匹配!

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

我相信結果應該是一個空的列表返回。

這是一個錯誤,還是我的代碼/思想存在缺陷?

回答

0

嘗試過濾這樣的:

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

是啊,我應該說 - 使用$ ..過濾[?(@ OSTYPE =='Linux的)不工作。 我特別想使用過濾器和標準,因爲它允許使用和構建更復雜的過濾,或者不&。 我似乎無法使用提示的語法工作的一件事是否定,所以過濾一切,除了Linux – liamj

+0

嗯,實際上這適用於否定,不知道爲什麼我以前沒有嘗試過! List > match = JsonPath.parse(jsonString).read(「$ .. filter [?(@。osType!='Windows')]」); 我想我會照你的建議去做,這似乎很奇怪,爲什麼過濾器和標準似乎不工作 – liamj

+0

這背後的代碼來自http://www.baeldung.com/guide-to-jayway-jsonpath - 我有一張向Baeldung開放的票據,爲什麼Filter/Criteria無法正常工作。如果我得到修復,我會在這裏發佈。 但是,您的回覆確實解決了問題,因此我會將其標記爲已接受 - 謝謝。 – liamj