Извлечь свойства из Newtonsoft jObject - PullRequest
0 голосов
/ 07 октября 2019

У меня есть консольное приложение ядра .net, в котором я пытаюсь получить значения двух свойств, которые находятся в возвращенном объекте JSON. Я выделил, где ошибка в строке 43, может кто-нибудь показать мне, где я иду не так, спасибо!

Ошибка:

System.ArgumentException: Доступ к значениям JArray с недопустимымзначение ключа: «имя». Ожидается индекс массива Int32.

в Newtonsoft.Json.Linq.JArray.get_Item (ключ объекта)
в PBXApp.Program.GetUser () в C: \ Development \ PBXApp \ PBXApp \ Program.cs: строка 43

Возвращено JSON:

{ 
   "results":[ 
      { 
         "name":"bulbasaur",
         "url":"https://pokeapi.co/api/v2/pokemon/1/"
      },
      { 
         "name":"ivysaur",
         "url":"https://pokeapi.co/api/v2/pokemon/2/"
      },
      { 
         "name":"venusaur",
         "url":"https://pokeapi.co/api/v2/pokemon/3/"
      }
   ]
}

Program.cs -

// retrieve asynchronous data from remote api
    public static async Task GetUser()
    {
        //baseUrl
        string baseUrl = "http://pokeapi.co/api/v2/pokemon/";
        try
        {
            // HttpClient implements a IDisposable interface
            using (HttpClient client = new HttpClient())
            {
                //initiate Get Request (await will execute the using statement in order)
                using (HttpResponseMessage res = await client.GetAsync(baseUrl))
                {
                    //get content from response, then convert it to a c# object
                    using (HttpContent content = res.Content)
                    {
                        //assign content to data variable by converting into a string using await
                        var data = await content.ReadAsStringAsync();
                        //convert data using newtonsoft JObject Parse class method
                        if (data != null)
                        {
                            //parse data into an object.
                            var dataObj = JObject.Parse(data)["results"];
enter code here
                            //ERROR ON THIS LINE
                            UserItem userItem = new UserItem(name: $"{dataObj["name"]}", url: $"{dataObj["url"]}");

                            //log userItem name and url to console
                            Console.WriteLine("Name:{0} Url:{1}", userItem.Name, userItem.Url);
                        }
                        else
                        {
                            Console.WriteLine("No returned data");
                        }
                    }
                }
            }
        }
        //exceptions
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
    }

UserItem.cs -

public class UserItem
    {
        public UserItem(string name, string url)
        {
            Name = name;
            Url = url;
        }
        public string Name { get; set; }
        public string Url { get; set; }
    }

1 Ответ

0 голосов
/ 07 октября 2019

dataObj - это массив JSON, но не с именованными ключами. Это просто обычный массив. Таким образом, вы не можете получить к нему доступ с помощью ключа с именем «name», потому что этот ключ не существует.

Вы можете использовать числовой индекс, но заранее не знаете (из JObject), какдлинный массив есть. Поэтому лучше проанализировать его как массив и выполнить цикл по элементам:

var dataObj = JArray.Parse(data)["results"];
foreach (var record in dataObj)
{
    var name = record["name"];
    // ...
}

Но зачем проходить через все трудности ручного анализа JSON? Просто создайте классы для хранения результатов и десериализуйте все сразу:

public class Pokémon
{
    public string name { get; set; }
    public string url { get; set; }
}

public class ListOfPokémon
{
    public List<Pokémon> results { get; set; }
}

var result = JsonConvert.DeserializeObject<ListOfPokémon>(jsonString);
foreach (var p in result.results)
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...