2016-10-22 5 views
1

Ich habe die folgende JSON-Datei. Es ist zur Kürze dieser Frage abgeschnitten. Eine tatsächliche JSON-Datei würde 10 bis 20 Nachrichten und 3 bis 15 Ergebnisse enthalten. basierend auf dem Wert des parameterId SchlüsselsWie kann ich mit JPath einen Wert basierend auf einem anderen Schlüsselwertpaar des gleichen Knotens zurückgeben?

{ 
    "messages": [ 
     { 
      "type": "msgInfo", 
      "description": "Some stuff happened" 
     }, 
     { 
      "type": "msgInfo", 
      "description": "More stuff happened" 
     }, 
     { 
      "type": "msgInfo", 
      "description": "yup, more stuff happened" 
     } 
    ], 
    "results": [ 
     { 
      "parameterId": "val_1", 
      "dataType": "Double", 
      "value": 123.45 
     }, 
     { 
      "parameterId": "val_2", 
      "dataType": "Double", 
      "value": 246.80 
     }, 
     { 
      "parameterId": "val_3", 
      "dataType": "Double", 
      "value": 135.79 
     }, 
     { 
      "parameterId": "val_4", 
      "dataType": "Long", 
      "value": 20161021 
     } 
    ] 
} 

Ich versuche, den Wert der value Taste abgerufen werden. Zum Beispiel muss ich "123.45" mit einem JPath zu "val_1" zurückgeben.

Bisher habe ich diesen Code (von this Beitrag kopiert), aber ich kann den Pfad nicht richtig erhalten.

JObject obj = JObject.Parse(json); 
JToken token = obj["results"]["parameterId"]; 

Console.WriteLine(token.Path + " -> " + token.ToString()); 
Console.ReadLine(); 

Was muss ich tun, um „123.45“ zurückzukehren, um eine JPath zu „val_1“ verwenden?

Antwort

0

Um die value Token von einem der Ergebnisse in den results Array basierend auf dem Wert des parameterId Token zu bekommen, müssen Sie mit einem JSONPath Abfrageausdruck die SelectToken Methode verwenden:

JToken token = obj.SelectToken("$.results[?(@.parameterId=='val_1')].value"); 

JSONPath Syntax kann Manchmal ist es etwas schwierig, richtig zu arbeiten, je nachdem, was Sie tun möchten. Sie können also einen Online-Ausdruck-Evaluator wie this one zum Experimentieren finden.

Alternativ können Sie eine LINQ-Abfrage verwenden, um die gleiche Sache zu tun:

JToken token = obj["results"] 
    .Where(result => (string)result["parameterId"] == "val_1") 
    .Select(result => result["value"]) 
    .FirstOrDefault(); 

Hier ist eine Geige beiden Ansätze zeigen: https://dotnetfiddle.net/8qiSCa

Verwandte Themen