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