Считайте json значение используя C# без использования свойства - PullRequest
4 голосов
/ 29 марта 2020

Мне нужно прочитать значение testCase.name для идентификатора 100000 из следующей JSON строки ответа.

response = {
  "count": 2,
  "value": [
    {
      "id": 100000,
      "project": {
        "id": "aaaa-bbbb-cccc-dddd",
        "name": "MyTestProject",
        "url": "https://dev.azure.com/MyOrg/_apis/projects/MyTestProject"
      },      
      "testCase": { "name": "GetProjectTeamDetails" }
     }, 
    {
      "id": 100001,
      "project": {
        "id": "aaaa-bbbb-cccc-dddd",
        "name": "MyTestProject",
        "url": "https://dev.azure.com/MyOrg/_apis/projects/MyTestProject"
      },      
      "testCase": { "name": "QueueBuild" }      
    }
  ]
}

Я пробовал следующие коды, но не смог достичь: Try1:

JObject o = JObject.Parse(response)
string testCaseName= (string)o["values"][0];

Try2:

 JObject jObject = JObject.Parse(response);
 string displayName = (string)jObject.SelectToken("testCase.name");

Ответы [ 4 ]

4 голосов
/ 29 марта 2020

Вы можете использовать

var jo = JObject.Parse(json);
var testCaseName  = (string)jo.SelectToken($"$.value[?(@id=={idToSearch})].testCase.name");

Обновление

На основе вашего вопроса в комментарии вы можете найти идентификатор с именем тестового набора, используя

jo.SelectTokens($"$.value[?(@testCase.name=='{nameToSearch}')].id")

Обратите внимание, что в этом случае вам нужно будет использовать .SelectTokens, так как есть вероятность дубликатов, как в примере в OP. Вы можете получить все результаты или первый на основе ваших требований.

var idList  = jo.SelectTokens($"$.value[?(@testCase.name=='{nameToSearch}')].id")
                 .Select(x=> long.Parse(x.ToString()));
var onlyFirst = (long)jo.SelectTokens($"$.value[?(@testCase.name=='{nameToSearch}')].id")
                 .First();
1 голос
/ 29 марта 2020

Другие ответы показаны с использованием SelectToken, что хорошо - если вы не хотите этого делать, вы все равно можете сделать это, обращаясь к одному свойству за раз:

using System;
using System.IO;
using Newtonsoft.Json.Linq;

class Test
{
    static void Main()
    {
        string json = File.ReadAllText("test.json");
        JObject obj = JObject.Parse(json);
        string testCase = (string) obj["value"][0]["testCase"]["name"];
        Console.WriteLine(testCase);
    }
}

В В вашем Try1 вы используете values вместо value и останавливаетесь на массиве - вы не запрашиваете свойство testCase или свойство name в этом.

В вашем Try2 вы делаете с точностью до наоборот - вы ищете testCase.name, не выбирая сначала элемент в массиве value.

В качестве третьего способа вы можете использовать Dynami c. набрав:

using System;
using System.IO;
using Newtonsoft.Json.Linq;

class Test
{
    static void Main()
    {
        string json = File.ReadAllText("test.json");
        dynamic obj = JObject.Parse(json);
        string testCase = obj.value[0].testCase.name;
        Console.WriteLine(testCase);
    }
}
1 голос
/ 29 марта 2020

Другой подход использует ключевое слово dynamic:

dynamic jt = JToken.Parse(response);
IEnumerable<dynamic> values = jt.value;
string name = values.FirstOrDefault(v => v.id == 100000)?.testCase.name;
1 голос
/ 29 марта 2020

Вам нужно пройти по иерархии.

JObject jObject = JObject.Parse(jsonString);
var testCaseName = jObject.SelectToken("value[0].testCase.name").ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...