簡體   English   中英

如何將 json 字符串反序列化為模型?

[英]How can I deserialize a json string in to a model?

大家好

像下面這樣的 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; }
    }

我正在嘗試像這樣翻譯它

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

但我收到一個錯誤

在此處輸入圖片說明

您必須將模型更改為此

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);

更新

試試這個反序列化土耳其語單詞

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

或者

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

問題是你的模型。 它應該如下所示。

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; }
    }

除了其他答案之外,如果您不確定某些字段是否為空,這將有所幫助:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM