将Json解析为JArray

时间:2014-01-08 17:28:40

标签: c# json

我收到错误

  

“未处理的类型异常   发生'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
                    }
                ]
            }
        ]
    }
}

1 个答案:

答案 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方法。