我对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位。
答案 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)
List<rates_>
您需要使用rates_[]
同样,当Mohit Shrivastava消化时 - 你需要添加Wrapper类,因为你请求返回CurrencyCodeValues
个对象的数组,而不是单个对象