C#将JSON反序列化为Object

时间:2016-10-24 06:48:38

标签: c# json parsing object

我对C#程序有点问题。这是我在C#中的第一个程序所以请 - 原谅:)

我想将我的json文件反序列化为对象,但我不知道应该如何构建我的类。我正在使用Newtonsoft JSON lib。

JSON文件:

  

http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json

Form1.cs中:

    private void button1_Click(object sender, EventArgs e)
    {
        CurrencyCodeValues k = new CurrencyCodeValues();
        WebClient myWebClient = new WebClient();
        dynamic result = myWebClient.DownloadString("http://api.nbp.pl/api/exchangerates/tables/A/last/?format=json");
        IList<CurrencyCodeValues> m = JsonConvert.DeserializeObject<CurrencyCodeValues>(result);
    }

的Class1.cs:

class CurrencyCodeValues
{
    public string table { get; set; }
    public string no { get; set; }
    public string effectiveDate { get; set; }
    public List<rates_> rates { get; set; }

}

public class rates_
{
    public string currency { get; set; }
    public string code { get; set; }
    public float mid { get; set; }
}

错误讯息:

  

无法将当前JSON数组(例如[1,2,3])反序列化为类型“WindowsFormsApplication4.CurrencyCodeValues”,因为该类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。   要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。   路径'',第1行,第1位。

3 个答案:

答案 0 :(得分:2)

由于您的错误消息表明您的课程应该如下所示

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string table { get; set; }
    public string no { get; set; }
    public string effectiveDate { get; set; }
    public Rate[] rates { get; set; }
}

public class Rate
{
    public string currency { get; set; }
    public string code { get; set; }
    public float mid { get; set; }
}

然后像

那样去除它
JsonConvert.DeserializeObject<Rootobject>(result);

答案 1 :(得分:1)

如果您不确定类模型必须与特定的json结构匹配,Visual Studio(自VS2013 Update 2以来)具有非常有用的功能。您可以复制您的json字符串,转到Visual Studio,然后单击编辑 - &gt;选择性粘贴 - &gt;将JSON粘贴为类。
现在,Visual Studio将构成一个适合的类模型。

在你的情况下,它看起来像这样(就像Mohit Shrivastava已经建议的那样):

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string table { get; set; }
    public string no { get; set; }
    public string effectiveDate { get; set; }
    public Rate[] rates { get; set; }
}

public class Rate
{
    public string currency { get; set; }
    public string code { get; set; }
    public float mid { get; set; }
}

答案 2 :(得分:0)

在反序列化json的同时,你需要使用基本结构和自定义clases,因为json不支持列表,映射和其他保存数据并在其上做一些逻辑的结构。这意味着您无法使用List<rates_>您需要使用rates_[]

同样,当Mohit Shrivastava消化时 - 你需要添加Wrapper类,因为你请求返回CurrencyCodeValues个对象的数组,而不是单个对象