2016-12-02 27 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);如果你感觉雄心勃勃,你可以自己实现这个功能。 –

相关问题