在试图反序列化JSON并在DataGridView中显示结果时获得异常
本文关键字:结果 显示 异常 DataGridView 反序列化 JSON 并在 | 更新日期: 2023-09-27 18:12:27
我有一些c#代码,我从API获得JSON数据。JSON看起来像这样:
{
"count": 32696,
"results": [{
"data_id": 0,
"name": "Extended Potion of Ghost Slaying",
"rarity": 0,
"restriction_level": 0,
"img": "",
"type_id": 0,
"sub_type_id": 0,
"price_last_changed": "2013-03-18 17:00:31 UTC",
"max_offer_unit_price": 0,
"min_sale_unit_price": 0,
"offer_availability": 0,
"sale_availability": 0,
"sale_price_change_last_hour": 0,
"offer_price_change_last_hour": 0
}]
}
(在结果中有不止一个项目)
我创建了2个这样的类:
internal class MyClass
{
public int data_id { get; set; }
public string name { get; set; }
public int rarity { get; set; }
public int restriction_level { get; set; }
public string img { get; set; }
public int type_id { get; set; }
public int sub_type_id { get; set; }
public string price_last_changed { get; set; }
public int max_offer_unit_price { get; set; }
public int min_sale_unit_price { get; set; }
public int offer_availability { get; set; }
public int sale_availability { get; set; }
public int sale_price_change_last_hour { get; set; }
public int offer_price_change_last_hour { get; set; }
}
internal class RootObject
{
public int count { get; set; }
public List<MyClass> results { get; set; }
}
这里是获取JSON并反序列化的部分:
using (WebClient wc = new WebClient())
{
string URI = "a good url";
wc.Headers.Add("Content-Type", "text");
string HtmlResult = wc.DownloadString(URI);
MyClass[] result = JsonConvert.DeserializeObject<MyClass[]>(HtmlResult);
DataTable dt = (DataTable)JsonConvert.DeserializeObject(HtmlResult, (typeof(DataTable)));
this.dataGridView1.DataSource = dt;
}
但是当我运行这段代码时,我得到了一个错误:
附加信息:无法反序列化当前JSON对象(例如{"name":"value"})输入"gwspiderv2"。MyClass[]'因为type需要一个JSON数组(例如[1,2,3])来正确反序列化。
我已经在另一个API上使用这种类型的代码而没有错误。我做错了什么?
在你的代码中,你似乎试图反序列化相同的JSON两种不同的方式,这并不使整个很多意义:
MyClass[] result = JsonConvert.DeserializeObject<MyClass[]>(HtmlResult);
DataTable dt = (DataTable)JsonConvert.DeserializeObject(HtmlResult, (typeof(DataTable)));
你得到第一个错误(在你的问题),因为你的JSON代表一个单一的对象,但你正试图将其反序列化成一个数组的MyClass
。您已经定义了RootObject
类,但是没有使用它。你应该这样做,因为它符合你的JSON。
你得到第二个错误(在评论@inan的答案),因为JSON是在错误的格式被反序列化成一个DataTable
。假设您正在尝试这样做,以便您可以在DataGridView
中显示数据。但是,为了将其用作数据源,您不需要将其转换为DataTable
。你可以只给你的DataGridView
和IList
,你已经在你的RootObject
中有了。
把你的代码改成:
RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult);
this.dataGridView1.DataSource = result.results;
使用RootObject进行反序列化,如下所示,它有MyClass的List
RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult);