我收到错误
“未处理的类型异常 发生'System.Reflection.TargetInvocationException' System.Windows.ni.dll“
当我尝试解析Json数据时。
MessageBox.Show(e.Result);
JArray a = JArray.Parse(e.Result);
完整错误
Error: Newtonsoft.Json,JsonReaderException: Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject. Path ", line 1,posistion 1. at Newtonsoft.Json.Linq.JArray.Load(JsonReader reader) at Newtonsoft.Json.Linq.JArray.Parse(String json) at GameStatsTrack.MainPage.dota_DownloadStringCompleted(Object senders, DownloadStringCompletedEventArgs e)
当我使用消息框输出时显示Json数据,但是当我尝试使用JArray时,它会导致程序抛出上述错误。
{
"result": {
"status": 1,
"num_results": 1,
"total_results": 500,
"results_remaining": 499,
"matches": [
{
"match_id": 460632360,
"match_seq_num": 419390537,
"start_time": 1389202765,
"lobby_type": 7,
"players": [
{
"account_id": 52194129,
"player_slot": 0,
"hero_id": 51
},
{
"account_id": 121480884,
"player_slot": 1,
"hero_id": 74
},
{
"account_id": 115633024,
"player_slot": 2,
"hero_id": 54
},
{
"account_id": 4294967295,
"player_slot": 3,
"hero_id": 47
},
{
"account_id": 106189937,
"player_slot": 4,
"hero_id": 5
},
{
"account_id": 4294967295,
"player_slot": 128,
"hero_id": 30
},
{
"account_id": 4294967295,
"player_slot": 129,
"hero_id": 89
},
{
"account_id": 4294967295,
"player_slot": 130,
"hero_id": 25
},
{
"account_id": 113052377,
"player_slot": 131,
"hero_id": 88
},
{
"account_id": 4294967295,
"player_slot": 132,
"hero_id": 48
}
]
}
]
}
}
答案 0 :(得分:0)
因为您使用的是Json.Net。您可以使用http://json2csharp.com/等服务生成可以反序列化的DTO对象。完成后,您将获得几个类,其中一个类称为RootObject
。您可以将其重命名为您想要的任何内容。然后你可以做类似的事情:
var dtoObj = JsonConvert.DeserializeObject<RootObject>(response);
响应是Json的字符串格式。此方法将为您提供DTO对象的优势,而不是处理JArray
。要访问您的数据,它将是dtoObj.Result.Matches
。
您的另一个选择是使用dynamic
。
var dynObj = JsonConvert.DeserializeObject<dynamic>(response);
动态的好处是你不必维护DTO对象,但是你会丢失一些强制类型和结构。但是通过动态,您可以通过dynObj.result.matches
访问匹配项。有时用dynamic
你必须明确地将它强制转换为某种Enumerable,这很烦人,所以我更喜欢上面的DTO方法。