簡體   English   中英

如何正確地為 json 反序列化創建 model?

[英]How correctly to create model for json deserialization?

如何將 JSON 反序列化為 C# 對象?

這是我的 JSON:

{
    "date": "2020-07-02 10:39:00+00",
    "base": "USD",
    "rates": {
        "FJD": 2.1692,
        "MXN": 22.602,
      [...]
    }
}

根model

public class BaseCurrencyModel
{
    public DateTime Date { get; set; }
    public string Base { get; set; }
    public IEnumerable<RatesModel> Rates { get; set; }
}

Object 用於數組值:

public class RatesModel
{
    public string currencyCode { get; set; }
    public string rate { get; set; }
}

當我使用

public Dictionary<string, string> Rates 

進入根 model 一切正常。 如果我使用

IEnumerable<RatesModel> Rates

我得到錯誤

Cannot deserialize the current JSON object into type 'System.Collections.Generic.IEnumerable`1[CurrencyConverter.Models.RatesModel]'because the type requires a JSON array (eg [1,2,3]) to deserialize correctly.
要修復此錯誤,請將 JSON 更改為 JSON 數組

json 費率不是數組它是字典

public class BaseCurrencyModel
{
    public DateTime Date { get; set; }

    public string Base { get; set; }

    public Dictionary<string,double> Rates { get; set; }
}

或者您可以將其轉換為列表

    var ratesParsed= JObject.Parse(json);
    BaseCurrencyModel rates = new BaseCurrencyModel
    {
        Date = ratesParsed["date"].ToObject<DateTime>(),
        Base = (string)ratesParsed["base"],
        Rates = ((JObject)ratesParsed["rates"]).Properties().Select(x => 
                   new RatesModel { currencyCode = x.Name, 
                   rate = Convert.ToDouble(x.Value) }
                ).ToList()
    };

class

public class BaseCurrencyModel
{
    public DateTime Date { get; set; }

    public string Base { get; set; }

    public List<Rate> Rates { get; set; }
}

output(json 格式)

{
  "Date": "2020-07-02T08:09:00-02:30",
  "Base": "USD",
  "Rates": [
    {
      "currencyCode": "FJD",
      "rate": 2.1692
    },
    {
      "currencyCode": "MXN",
      "rate": 22.602
    }
  ]
}

暫無
暫無

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

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