2016-10-24 198 views
1

我有一个C#程序的小问题。这是我在C#中的第一个程序 - 请原谅:)C#反序列化JSON到对象

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

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

+0

刚写此CurrencyCodeValues米= JsonConvert.DeserializeObject (结果); –

回答

1

由于您的错误信息表明您的类应该是这样的

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

,然后deseralize它像

JsonConvert.DeserializeObject<Rootobject>(result); 
0

而deserialising JSON你需要使用基本的结构和自定义分类,因为json不支持列表,地图和其他保存数据的逻辑结构。这意味着你不能使用List<rates_>你需要使用rates_[]

也为莫希特Shrivastava sugested - 你需要添加包装类,因为YOUT请求返回CurrencyCodeValues对象,而不是单一的对象

1

的阵列。如果你不知道您的类模型如何看起来像匹配特定的json结构,Visual Studio(自VS2013 Update 2以来)具有相当有用的功能。您可以复制您的json字符串,转到Visual Studio,然后单击编辑 - >选择性粘贴 - >将JSON粘贴为类。
现在Visual Studio将组成一个合适的类模型。


在您的情况下,它看起来像这样(如莫希特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; } 
}