如何将JSONPath表达式用作另一个JSONPath表达式中的过滤器?

时间:2016-12-02 14:42:54

标签: c# json json.net jsonpath

我希望通过使用JSONPath表达式过滤来从JSON字符串中选择对象,并在过滤器中嵌入另一个表达式。换句话说,我想过滤JSON数据中其他地方存在的值。

例如:

在以下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": "mark@abc.de"
                            }, {
                                    "role": "CR",
                                    "roleDescription": "Chapter Responsible",
                                    "loginName": "uli26819",
                                    "email": "uli@abc.de"
                            }
                    ]
            },
            "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": ""
                            }
                    ]
            }
    }
}

1 个答案:

答案 0 :(得分: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