Как правильно десериализовать объект JSON, используя C# - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь десериализовать объект json, содержащий список стран, но продолжаю получать сообщение об ошибке:

Type System.String 'не поддерживается для десериализации массива.

Я могу получить объект JSON (список стран) из API, но когда я пытаюсь десериализовать объект JSON

Это мой метод для получения списка стран и ie их в модель списка стран

public List<CountriesList> GetCountries()
            {
                try
                {                     
                    string apiCountriesUrl = "https://restcountries.eu/rest/v2/all"; 
                    string response = GetServiceCallByUrl(apiCountriesUrl);
                    var countriesObj = System.Web.Helpers.Json.Decode<List<CountriesList>>(response);

                    return countriesObj;
                }
                catch (Exception exception)
                {
                    throw exception;
                }
            }

Модель списка стран

  using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

namespace ApplicationPortal.Models
{
    public class CountriesList
    {
        public string name { get; set; }
        public string callingCodes { get; set; }
    }
}

Ответы [ 4 ]

0 голосов
/ 09 мая 2020

dotnetfiddle

см. Код выше.

Я использовал quicktype.io, чтобы получить класс POCO для json, который поступает из вызова api

Ошибка, которую вы получаете, заключается в том, что callCodes - это список строк, а в вашей модели это строка

public List<string> CallingCodes { get; set; }

обновите вашу модель, чтобы она отражала json модель

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

В моем коде используется пакет Newtonsoft. Json, поскольку его использует quicktype.io, вы можете изменить его и ограничить свою модель только теми полями, которые вам нужны, и вы должны иметь возможность использовать System.Web.Helpers. Json .Decode, как вы используете прямо сейчас.

0 голосов
/ 09 мая 2020

Я бы порекомендовал автоматически генерировать необходимые классы из ваших данных:

Скопируйте пример json, который вы sh импортируете, затем в Visual Studio выберите Edit / Paste Special / Paste classes как Json.

Это создаст классы, которые позволят импортировать json правильно, без каких-либо предположений.

Существуют онлайн-версии, которые создают еще лучший код: https://app.quicktype.io/?l=csharp

0 голосов
/ 09 мая 2020

CallCodes - это массив строк, измените модель на public List<string> callingCodes { get; set; }

0 голосов
/ 09 мая 2020

Вам необходимо добавить ссылку на Newtonsoft.dll перед тем, как попробовать это:

public List<CountriesList> GetCountries()
            {
                try
                {                     
                    string apiCountriesUrl = "https://restcountries.eu/rest/v2/all"; 
                    string response = GetServiceCallByUrl(apiCountriesUrl);
                    var countriesObj = JsonConvert.DeserializeObject<List<CountriesList>>(response);

                    return countriesObj;
                }
                catch (Exception exception)
                {
                    throw exception;
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...