Как я могу десериализовать строку json в модель? - PullRequest
0 голосов
/ 02 апреля 2020

Привет всем ,

Модель json, подобная приведенной ниже, заставляет меня вернуться через API.

 {
  "data": [
    {
      "countryStats": {
        "order": 2,
        "confirmedCount": 15679,
        "deathCount": 277,
        "recovryCount": 333,
        "name": "Türkiye"
      },
      "cityStats": [

      ]
    },
    {
      "countryStats": {
        "order": 1,
        "confirmedCount": 216722,
        "deathCount": 5138,
        "recovryCount": 8672,
        "name": "Amerika Birleşik Devletleri"
      },
      "cityStats": [
        {
          "order": 1,
          "confirmedCount": 84070,
          "deathCount": 1941,
          "recovryCount": 0,
          "name": "New York"
        },..

Я извлекаю эти json данные с кодом ниже.

static string GET(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            try
            {
                WebResponse response = request.GetResponse();
                using (Stream responseStream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
                    return reader.ReadToEnd();
                }
            }
            catch (WebException ex)
            {
                WebResponse errorResponse = ex.Response;
                using (Stream responseStream = errorResponse.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
                    String errorText = reader.ReadToEnd();
                    // log errorText
                }
                throw;
            }
        }

Вот мне строковое выражение. Я хочу присвоить это строковое выражение моей модели, как мне это сделать.

Моя модель

public class CountryStats
    {
        public int Order  { get; set; }
        public int ConfirmedCount { get; set; }
        public int DeathCount { get; set; }
        public int RecovryCount { get; set; }
        public string Name { get; set; }
        public List<CountryStats> CityStats { get; set; }
    }

I Я пытаюсь перевести это так

var result = JsonConvert.DeserializeObject<List<CountryStats>>(res);

Но я получаю сообщение об ошибке

enter image description here

Ответы [ 3 ]

2 голосов
/ 02 апреля 2020

Вы должны изменить модель на эту

public class BaseClass
{
    public List<CountryStats> Data { get; set; }
}
public class CountryStats
{
    public int Order  { get; set; }
    public int ConfirmedCount { get; set; }
    public int DeathCount { get; set; }
    public int RecovryCount { get; set; }
    public string Name { get; set; }
    public List<CountryStats> CityStats { get; set; }
}

, а затем десериализовать ответ на BaseClass

var result = JsonConvert.DeserializeObject<BaseClass>(res);

Обновление

попробовать это десериализовать тюрки sh слово

res = res.Replace("\"","'");
var result = JsonConvert.DeserializeObject<BaseClass>(res);

или

var result = HttpUtility.JavaScriptStringEncode(JsonConvert.DeserializeObject<BaseClass>(res));
1 голос
/ 02 апреля 2020

В дополнение к другим ответам, если вы не уверены, что некоторые поля могут быть пустыми или нет, это поможет:

public partial class Welcome
{
    [JsonProperty("data", NullValueHandling = NullValueHandling.Ignore)]
    public List<Datum> Data { get; set; }
}

public partial class Datum
{
    [JsonProperty("countryStats", NullValueHandling = NullValueHandling.Ignore)]
    public CountryStats CountryStats { get; set; }

    [JsonProperty("cityStats", NullValueHandling = NullValueHandling.Ignore)]
    public List<object> CityStats { get; set; }
}

public partial class CountryStats
{
    [JsonProperty("order", NullValueHandling = NullValueHandling.Ignore)]
    public long? Order { get; set; }

    [JsonProperty("confirmedCount", NullValueHandling = NullValueHandling.Ignore)]
    public long? ConfirmedCount { get; set; }

    [JsonProperty("deathCount", NullValueHandling = NullValueHandling.Ignore)]
    public long? DeathCount { get; set; }

    [JsonProperty("recovryCount", NullValueHandling = NullValueHandling.Ignore)]
    public long? RecovryCount { get; set; }

    [JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
    public string Name { get; set; }
}

Затем вы можете десериализовать его:

var result = JsonConvert.DeserializeObject<Welcome>(res);
1 голос
/ 02 апреля 2020

Проблема в вашей модели. Это должно выглядеть как показано ниже.

public class CountryStatsCollection
{
    public List<ContryStats> Data { get; set }
}

public class CountryStats
    {
        public int Order  { get; set; }
        public int ConfirmedCount { get; set; }
        public int DeathCount { get; set; }
        public int RecovryCount { get; set; }
        public string Name { get; set; }
        public List<CountryStats> CityStats { get; set; }
    }
...