簡體   English   中英

JsonPath:如果滿足條件則選擇根級字段

[英]JsonPath: Selecting root level field if satisfies a condition

給定以下Json輸入:

{ 
  "category": "fiction",
  "author": "Evelyn Waugh",
  "title": "Sword of Honour",
  "price": 12.99
}

如果作者與給定的名稱匹配,我需要 select 作者字段。 Evelyn Waugh 我正在努力為此編寫 JsonPath 表達式。 我嘗試了以下但沒有成功。 任何人都可以建議正確的表達方式嗎?

$.author?(@ == 'Evelyn Waugh')
$.?(@.author == 'Evelyn Waugh')
$..?(@.author == 'Evelyn Waugh')

試試 $.[?($.author=='Evelyn Waugh')]

我想你可以這樣做:

$[?($.author === @ && @ == 'Evelyn Waugh')]

但如果你問我,這是一個非常無用的查詢並且容易出錯。 如果還有另一個帶有作者名字的屬性,那就太糟糕了。

坦率地說,您應該只獲取作者並測試它是否是您期望的名稱。 不要試圖強迫它起作用,它不應該以這種方式使用。

對我來說@Bernie 的回答似乎有效:

$[?($.author == 'Evelyn Waugh')]

它適用於 3/4 json 路徑執行程序(不幸的是,一個不起作用的是 jsonpath.com)。

工作的是:

  1. https://codebeautify.org/jsonpath-tester
  2. https://jsonpath.herokuapp.com/
  3. WireMock(在java中使用jsonpath)

對於那些想知道為什么使用它以及為什么不在這里進行簡單比較的人,請繼續閱讀。

就我而言,我使用 wiremock 來模擬基於 json 的不同輸入值的不同服務器響應,例如,當“作者”“Evelyn Waugh”時,然后回復{"books":"10"}以及所有其他值“作者”回復,可能是{"books":"20"}

所以這里的選項只是與 json 路徑匹配,這就是訣竅。

對於那些仍然想知道的人,請注意,wiremock 以某種方式不適用於ifelse條件,如果您依賴於 else 條件(通配符匹配),它會先於所有條件。

在執行查詢之前將您的根 object 添加到數組中。 那么這應該有效。

'$..[?(@.author == "Evelyn Waugh")]'

使用 jsonpath

import jp from 'jsonpath';

const queryResults = jp.query([yourObject], '$..[?(@.author == "Evelyn Waugh")]');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM