2015-12-22 3 views
0

У меня JSON, который выглядит следующим образом. Я пытаюсь использовать JSONPath, чтобы получить значение __ content __, где SKU - «8A-OK9F-9LI8» и Component.Type == 'Principal'. Прямо сейчас, я играю с this JSON Path Expression Tester.Проблема Разбор Array vs Non-Array JSON с JSONPath

Это выражение JSONPath захватывает все компоненты информации, мне нужно:

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

Но фильтрация далее, такие как $.Order..Fulfillment[?(@.SKU=='8A-OK9F-9LI8')]..Component[?(@.Type=='Principal')] хватает только один (я считаю, что массив один) из двух составных элементов мне нужно. Я подозреваю, что это потому, что один является массивом, а один - одним элементом 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} является рубин интерполированное строку, содержащую 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