Получение значения возвращаемой строки JSON C# - PullRequest
1 голос
/ 11 марта 2020

У меня есть JSON ответ, и мне нужно получить "Id" из него. Я попытался 2 варианта кода ниже

    using (JsonDocument document = JsonDocument.Parse(jsonstring))
    {

         JsonElement root = document.RootElement;
         JsonElement resultsElement = root.GetProperty("Result");
         List<string> names = new List<string>();

         foreach (var result in resultsElement.EnumerateObject())
         {


               if (result.Value.TryGetProperty("Id", out resultsElement))
               {
                    names.Add(resultsElement.GetString());
               }
         }
   }

Запрошенная операция требует элемент типа «Объект», но целевой элемент имеет тип «Число».

скорректировал EnumerateObject для перечисления массива, но я все еще получаю ту же ошибку с 'Array' - 'Object' вместо 'Object' - 'Array'

ответ JSON имеет следующий формат:

    {
    "code":1,
    "result":{
        "Id":1,
        "Name":"name"
        }
    }

Не получается получить указанный идентификатор c, используя метод bove.

Ответы [ 2 ]

5 голосов
/ 11 марта 2020

Я думаю, ты делаешь это тяжело для себя; намного проще сопоставить с типом:

public class MyRoot {
    [JsonProperty("code")]
    public int Code {get;set;}
    [JsonProperty("result")]
    public MyResult Result {get;set;}
}
public class MyResult {
    public int Id {get;set;}
    public string Name {get;set;}
}

и использовать:

var root = JsonConvert.DeserializeObject<MyRoot>(json);
var result = root.Result;
// etc
1 голос
/ 11 марта 2020

Вы можете перечислить проанализированный элемент JsonDocument Root и result. Или сделать это рекурсивно для каждого дочернего узла, который имеет тип JsonValueKind.Object и получить значение id

using (var document = JsonDocument.Parse(File.ReadAllText("test.json")))
{
    JsonElement root = document.RootElement;
    var names = new List<string>();
    Enumerate(root);

    void Enumerate(JsonElement element)
    {
        if (element.ValueKind == JsonValueKind.Object)
        {
            foreach (var item in element.EnumerateObject())
            {
                if (item.Value.ValueKind == JsonValueKind.Object)
                {
                    Enumerate(item.Value);
                }

                if (item.Value.ValueKind == JsonValueKind.Number && item.Name == "Id")
                {
                    //Console.WriteLine(item.Value.GetRawText());
                    names.Add(item.Value.GetRawText());
                }
            }
        }
    }
}

. Этот код позволяет перечислять JSON с любым количеством уровней вложенности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...