在试图反序列化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并在DataGridView中显示结果时获得异常

在你的代码中,你似乎试图反序列化相同的JSON两种不同的方式,这并不使整个很多意义:

MyClass[] result = JsonConvert.DeserializeObject<MyClass[]>(HtmlResult);
DataTable dt = (DataTable)JsonConvert.DeserializeObject(HtmlResult, (typeof(DataTable)));

你得到第一个错误(在你的问题),因为你的JSON代表一个单一的对象,但你正试图将其反序列化成一个数组的MyClass。您已经定义了RootObject类,但是没有使用它。你应该这样做,因为它符合你的JSON。

你得到第二个错误(在评论@inan的答案),因为JSON是在错误的格式被反序列化成一个DataTable。假设您正在尝试这样做,以便您可以在DataGridView中显示数据。但是,为了将其用作数据源,您不需要将其转换为DataTable。你可以只给你的DataGridViewIList,你已经在你的RootObject中有了。

把你的代码改成:

RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult);
this.dataGridView1.DataSource = result.results;

使用RootObject进行反序列化,如下所示,它有MyClass的List

RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult);