尝试反序列化JSON并在DataGridView中显示结果时获取异常

时间:2016-10-10 16:58:53

标签: c# json datagridview json.net

我有一些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
    }]
}

(但结果中只有一个项目。)

我做了两个这样的课程:

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上使用这种类型的代码而没有错误。我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

在你的代码中,似乎你试图以两种不同的方式反序列化相同的JSON,这并没有多大意义:

item3

您收到第一个错误(在您的问题中),因为您的JSON代表单个对象,但您尝试将其反序列化为MyClass[] result = JsonConvert.DeserializeObject<MyClass[]>(HtmlResult); DataTable dt = (DataTable)JsonConvert.DeserializeObject(HtmlResult, (typeof(DataTable))); 数组。您已定义了MyClass类,但您没有使用它。看来你应该这样,因为它适合你的JSON。

您收到第二个错误(在评论@inan的答案中),因为JSON格式错误,无法反序列化为RootObject。大概你正试图这样做,这样你就可以在DataTable中显示数据。但是,您不需要将其转换为DataGridView,以便将其用作数据源。您只需将DataTable DataGridView IList中的RootObject提供给您RootObject result = JsonConvert.DeserializeObject<RootObject>(HtmlResult); this.dataGridView1.DataSource = result.results;

将您的代码更改为:

export default class AllItems extends Component {
  constructor () {
    super()
    this.state=({ user: cookie.load('user')})
    this.httpHandler = axios.create({
      baseURL: 'http://localhost:3000/',
      headers: {
        'Authorization': this.state.user.token
      }
    })
  }

  componentWillMount() {
    this.httpHandler('/products/')
    .then(function (response) {
      this.setState({ winks: response.data.data})
      console.log(this.state.winks)
    }.bind(this))
  }
  render() {
    return (

              <Winks products={this.state.winks} />

    )
  }
}