2016-10-22 2 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 
     } 
    ] 
} 

Я пытаюсь получить значение ключа value на основе значения ключа parameterId. Например, мне нужно вернуть «123.45», используя JPath для «val_1».

До сих пор у меня этот код (скопирован из this), но я не могу получить правильный путь.

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

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

Что мне нужно сделать, чтобы вернуть «123,45» с помощью JPath к «val_1»?

ответ

0

Чтобы получить value маркер одного из результатов в results массиве на основе значения parameterId маркеров, вы должны использовать метод SelectToken с выражением в JSONPath запроса:

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

JSONPath синтаксис может быть немного сложным, чтобы получить право иногда, в зависимости от того, что вы пытаетесь сделать, поэтому вы можете найти онлайн-оценщик выражения, такой как this one, с которым полезно экспериментировать.

В качестве альтернативы, вы можете использовать запрос LINQ, чтобы сделать то же самое:

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

Здесь скрипку показывает оба подхода: https://dotnetfiddle.net/8qiSCa