反序列化 Json usinc C#, web api, asp.net mvc

Posted

技术标签:

【中文标题】反序列化 Json usinc C#, web api, asp.net mvc【英文标题】:Deserialize Json usinc C# , web api, asp.net mvc 【发布时间】:2021-12-17 19:01:25 【问题描述】:

这是我的 JSON 数据示例,从 this website 获得

[
  
    "date": "2021-11-03T00:00:00.000Z",
    "currencies": [
      
        "code": "AED",
        "quantity": 10,
        "rateFormated": "8.6246",
        "diffFormated": "0.0032",
        "rate": 8.6246,
        "name": "არაბეთის გაერთიანებული საამიროების დირჰამი",
        "diff": -0.0032,
        "date": "2021-11-02T17:44:59.825Z",
        "validFromDate": "2021-11-03T00:00:00.000Z"
      ,
      
        "code": "AMD",
        "quantity": 1000,
        "rateFormated": "6.6368",
        "diffFormated": "0.0036",
        "rate": 6.6368,
        "name": "სომხური დრამი",
        "diff": 0.0036,
        "date": "2021-11-02T17:44:59.825Z",
        "validFromDate": "2021-11-03T00:00:00.000Z"
      
    ]
  
]

和我的班级 -

public class CurrencyDTO

    public string code  get; set; 
    public int quantity  get; set; 
    public string rateFormated  get; set; 
    public string diffFormated  get; set; 
    public double rate  get; set; 
    public string name  get; set; 
    public double diff  get; set; 
    public DateTime date  get; set; 
    public DateTime validFromDate  get; set; 


public class Root

    public DateTime date  get; set; 
    public List<CurrencyDTO> currencies  get; set; 

当我试图为我的网站反序列化它时,模型正在显示但没有数据(见图)

索引法

                var webClient = new WebClient();
                HttpResponseMessage response = client.GetAsync(BaseURL).Result;
                List<CurrencyDTO> ct = new List<CurrencyDTO>();
                if (response.IsSuccessStatusCode)
                
                    String rawJSON = webClient.DownloadString("https://nbg.gov.ge/gw/api/ct/monetarypolicy/currencies/ka/json");
                    ct = JsonConvert.DeserializeObject<List<CurrencyDTO>>(rawJSON);
                
                return View(ct);

问题是我的课程还是我试图反序列化它的方式?

【问题讨论】:

调试代码时,您是否看到ct 变量中的任何数据?可以分享一下查看代码吗? ct = JsonConvert.DeserializeObject>(rawJSON); 我正在尝试添加调试点,但没有任何反应 这给了我一个错误 检查 JSON 的第一行,它不是一个数组,而是一个类,该类在名为 date 的属性中具有日期,在名为 currencies 的属性中具有数组。所以你应该使用在反序列化中具有这些属性的类Root 【参考方案1】:

使用下面的代码,希望你能得到数据:

var webClient = new WebClient();
HttpResponseMessage response = client.GetAsync(BaseURL).Result;
List<CurrencyDTO> ct = new List<CurrencyDTO>();
if (response.IsSuccessStatusCode)

    String rawJSON = webClient.DownloadString("https://nbg.gov.ge/gw/api/ct/monetarypolicy/currencies/ka/json");
    var data = JsonConvert.DeserializeObject<List<Root>>(rawJSON);
    ct = data.SelectMany(c => c.currencies).ToList();

return View(ct);

【讨论】:

data.currencies 有错误 你的DeserializeObject&lt;List&lt;Root&gt;&gt; 应该是DeserializeObject&lt;Root&gt; @namizo 查看我对这个问题的评论,了解如何解决这个问题以及对问题 cmets 的解释。 “因为在 json 对象中它不是正确的日期时间格式”是什么意思?这是一个完美的日期格式。 dotnetfiddle.net/9f9tSV 我已经编辑了 ct = data.SelectMany(c => c.currencies).ToList();这条线。现在检查。

以上是关于反序列化 Json usinc C#, web api, asp.net mvc的主要内容,如果未能解决你的问题,请参考以下文章

将 json 反序列化为匿名类型列表

c# 反序列化 Json 字符串

Json序列化与反序列化

Json序列化与反序列化

如何手动反序列化 JSON 并像 Web API 那样自动验证模型?

WCF REST Web 服务 - Json 的反序列化