2016-12-02 5 views
2

Я хочу выбрать объекты из строки JSON путем фильтрации с использованием выражения JSONPath с другим выражением, встроенным в фильтр. Другими словами, я хочу фильтровать значение, которое присутствует в других местах в данных JSON.Как я могу использовать выражение JSONPath как фильтр внутри другого выражения JSONPath?

Например:

В следующих данных JSON имеется значение в $.Item.State.stepId (в настоящее время "QG2.0"). Мне нужно иметь выражение JSONPath, который выбирает значения на основе этого значения, как это:

$..Step[?(@.stepId==$Item.State.stepId)].actionDate 

Но это не будет возвращать результаты. Если я использую строку («QG2.0») следующим образом:

$..Step[?(@.stepId=='QG2.0')].actionDate 

оно вернет необходимые данные.

Что случилось, или это даже не возможно? Мой JSON ниже:

{ 
    "Item": { 
      "Common": { 
        "folio": "PSH-000016020", 
        "setName": "123-XZ200-1", 
        "wfId": "Kat1_002", 
        "wfIssue": "002", 
        "wfIdIssue": "Kat1_002.002" 
      }, 
      "State": { 
        "status": "IN WORK", 
        "stepId": "QG2.0", 
        "stepDescription": "Validation" 
      }, 
      "Participants": { 
        "Participant": [ 
          { 
            "role": "PR", 
            "roleDescription": "Product Responsible", 
            "loginName": "marc102", 
            "email": "[email protected]" 
          }, { 
            "role": "CR", 
            "roleDescription": "Chapter Responsible", 
            "loginName": "uli26819", 
            "email": "[email protected]" 
          } 
        ] 
      }, 
      "Steps": { 
        "Step": [ 
          { 
            "stepId": "QG1.0", 
            "stepTitle": "Preparation", 
            "actionDate": "2016-06-28T10:28:09", 
            "actionDueDate": "", 
            "actionBy_Name": "Marc", 
            "actionBy_Account": "marc102", 
            "action": "complete", 
            "Comment": "" 
          }, { 
            "stepId": "QG2.0", 
            "stepTitle": "Check Requirements", 
            "actionDate": "2016-08-08T14:17:04", 
            "actionDueDate": "", 
            "actionBy_Name": "Uli", 
            "actionBy_Account": "uli26819", 
            "action": "complete", 
            "Comment": "" 
          } 
        ] 
      } 
    } 
} 

ответ

0

Я не думаю, что реализация Json.NET по JSONPath поддерживает эту концепцию.
Однако, вы можете получить информацию, которую вы хотите, если вы разбить запрос на два этапа:

JObject obj = JObject.Parse(json); 
JToken stepId = obj.SelectToken("Item.State.stepId"); 
JToken actionDate = obj.SelectToken(string.Format("$..Step[?(@.stepId=='{0}')].actionDate", stepId)); 
Console.WriteLine(actionDate.ToString()); 

скрипки: https://dotnetfiddle.net/KunYTf

+0

Привет Брайан, спасибо за ответ. Я подумал об этом, но надеялся, что будет прямое решение. –

+0

Ну, Json.Net - это [с открытым исходным кодом] (https://github.com/JamesNK/Newtonsoft.Json) в конце концов; вы всегда можете реализовать эту функцию самостоятельно, если вы чувствуете амбициозность. –