2016-10-22 6 views
1

私は次のJSONファイルを持っています。この質問の簡潔さのために切り捨てられています。実際のJSONファイルには、10〜20個のメッセージと3〜15個の結果が含まれます。JPathを使用して、同じノードの別のキー値のペアに基づいて値を返すにはどうすればよいですか?

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

私はparameterIdキーの値に基づいてvalueキーの値を取得しようとしています。たとえば、 "val_1"にJPathを使用して "123.45"を返す必要があります。

これまでのところ(this投稿からコピーされた)このコードはありますが、正しいパスを取得できません。

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

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

「val_1」へのJPathを使用して「123.45」を返すには、どうすればよいですか?

答えて

0

parameterIdトークンの値に基づいてresults配列の結果の1からvalueトークンを取得するには、あなたがJSONPathクエリ式でSelectTokenメソッドを使用する必要があります。

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

JSONPath構文ことができますあなたがしようとしていることに応じて、時にはちょっとやりにくいので、実験に役立つthis oneのようなオンライン式評価ツールがあります。 https://dotnetfiddle.net/8qiSCa

:フィドルは、両方のアプローチを示している。ここ

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

また、あなたは同じことを行うためにLINQクエリを使用することができます

関連する問題