2015-12-22 54 views
0

我有JSON,如下所示。我試圖使用JSONPath來獲取SKU爲「8A-OK9F-9LI8」和Component.Type =='Principal'的__ content __值。現在,我正在玩this JSON路徑表達式測試器。解決數組問題與使用JSONPath的非數組JSON問題

這JSONPath表達抓住所有的我所需要的組件的信息:

$.Order..Fulfillment[?(@.SKU=='8A-OK9F-9LI8')]..Component 

但是濾波還如$.Order..Fulfillment[?(@.SKU=='8A-OK9F-9LI8')]..Component[?(@.Type=='Principal')]抓鬥只有一個(I相信陣列的一個)我需要兩個組件元件。我懷疑這是因爲一個是一個數組,一個是單個JSON元素。是否有可能通過一個命令來獲取這個數據,還是必須組合幾個命令(一個用於數組,另一個用於單個JSON元素)?如果是這樣,我怎樣才能獲取我目前沒有獲得的其他組件信息:

$.Order..Fulfillment[?(@.SKU=='8A-OK9F-9LI8')]..Component[?(@.Type=='Principal')]

同樣,我的目標是抓住「__ content__」值並按特定SKU進行過濾,並在其中Component.Type =='Principal'。喜歡的東西:

$.Order..Fulfillment[?(@.SKU=='8A-OK9F-9LI8')]..Component[?(@.Type=='Principal')]..Amount..__content__

我期待找回["8.49", "8.49"]

這裏是我與測試JSON:

{ 
    "SettlementData": {}, 
    "Order": [ 
    { 
     "OrderID": "XXX", 
     "Fulfillment": { 
     "Item": { 
      "SKU": "8A-OK9F-9LI8", 
      "Quantity": "1", 
      "ItemPrice": { 
      "Component": [ 
       { 
       "Type": "Principal", 
       "Amount": { 
        "__content__": "8.49", 
        "currency": "USD" 
       } 
       }, 
       { 
       "Type": "Tax", 
       "Amount": { 
        "__content__": "0.74", 
        "currency": "USD" 
       } 
       } 
      ] 
      } 
     } 
     } 
    }, 
    { 
     "OrderID": "XXX", 
     "Fulfillment": { 
     "Item": { 
      "SKU": "8A-OK9F-9LI8", 
      "Quantity": "1", 
      "ItemPrice": { 
      "Component": { 
       "Type": "Principal", 
       "Amount": { 
       "__content__": "8.49", 
       "currency": "USD" 
       } 
      } 
      } 
     } 
     } 
    } 
    ] 
} 

回答

0

我能分兩次來解決這個問題。在這個例子中,#{sku}是一個Ruby插入包含我傳遞的SKU字符串:

$.Order..Fulfillment[?(@.SKU=='#{sku}')]..ItemPrice..[?(@.Type=='Principal')].Amount.__content__ 

$.Order..Fulfillment..Item[?(@.SKU=='#{sku}')]..ItemPrice..[?(@.Type=='Principal')].Amount.__content__ 

使用紅寶石寶石「jsonpath」,我能得到我需要這樣的金額:

amount  = JsonPath.on(settlement, "$.Order..Fulfillment[?(@.SKU=='#{sku}')]..ItemPrice..[?(@.Type=='Principal')].Amount.__content__") 
    .map(&:to_f).inject(:+) 
    amount2 = JsonPath.on(settlement, "$.Order..Fulfillment..Item[?(@.SKU=='#{sku}')]..ItemPrice..[?(@.Type=='Principal')].Amount.__content__") 
    .map(&:to_f).inject(:+) 
+0

這似乎是我使用的庫中的一個限制。我已經將每個散列元素轉換爲一個數組來克服這個問題。感謝您的投票,但沒有提供原因。 – Trinculo