2016-12-02 6 views
2

Ich möchte Objekte aus einer JSON-Zeichenfolge auswählen, indem Sie einen JSONPath-Ausdruck mit einem anderen im Filter eingebetteten Ausdruck filtern. Mit anderen Worten, ich möchte nach einem Wert filtern, der an anderer Stelle in den JSON-Daten vorhanden ist.Wie kann ich einen JSONPath-Ausdruck als Filter in einem anderen JSONPath-Ausdruck verwenden?

Zum Beispiel:

Im folgenden JSON-Daten gibt es einen Wert in $.Item.State.stepId (derzeit "QG2.0"). Ich brauche einen JSONPath Ausdruck haben, die Werte basierend auf diesem Wert, wie folgt wählt:

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

Aber das wird keine Ergebnisse nicht zurück. Wenn ich die Zeichenkette ("QG2.0") direkt wie folgt verwende:

wird es die erforderlichen Daten zurückgeben.

Was ist falsch oder ist es nicht möglich? Meine JSON ist unten:

{ 
    "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": "" 
          } 
        ] 
      } 
    } 
} 

Antwort

0

Ich glaube nicht Json.Net Implementierung von JSONPath dieses Konzept unterstützt.
Sie können jedoch immer noch die gewünschten Informationen erhalten, wenn Sie die Abfrage in zwei Schritten durchbrechen:

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()); 

Fiddle: https://dotnetfiddle.net/KunYTf

+0

Hallo Brian, danke für die Antwort. Ich dachte darüber nach, hoffte aber, dass es eine direkte Lösung geben würde. –

+0

Nun, Json.Net ist [Open Source] (https://github.com/JamesNK/Newtonsoft.Json) immerhin; Sie können das Feature immer selbst implementieren, wenn Sie sich ehrgeizig fühlen. –

Verwandte Themen