簡體   English   中英

C#JSON反序列化字典異常

[英]C# JSON Deserialization Dictionary Exception

我需要有關C#中JSON解析的幫助。 我正在嘗試解析和使用我的JSON字符串。 我不想創建一個實例化該對象的類,因為可能會有更多帶有許多返回對象類型的調用,例如錦標賽,團隊,用戶等。

{
    "response":{
        "2":{
            "tournament_id":2,
            "created_at":{
                "date":"2015-11-09 21:01:06",
                "timezone_type":3,
                "timezone":"Europe/Prague"
            },
            "creator_id":1,
            "name":"Tournament Test #1",
            "desc":"...!",
            "state":0,
            "is_visible":1
        },
        "3":{
            "tournament_id":3,
            "created_at":{
                "date":"2015-11-09 21:01:06",
                "timezone_type":3,
                "timezone":"Europe/Prague"
            },
            "creator_id":1,
            "name":"Tournament Test #2",
            "desc":"...",
            "state":1,
            "is_visible":1
        }
    },
    "error":false
}

我正在使用JSON.net庫解析JSON字符串,這是我在程序中使用的C#代碼:

public class API
    {
        private WebClient client;

        protected string auth_key   = "xxx";
        protected string base_url   = "http://127.0.0.1/tournaments_api/www/";
        private string endpoint_url = "";
        private string url_params   = "";

        public string url_data;
        public Dictionary<string, string>[] data;

        public bool success = false;
        public string errorMessage = "";
        public int errorCode = 0;

        public API()
        {
            this.client = new WebClient();
        }

        private void Request()
        {

            string url = this.base_url + this.endpoint_url + "/" + this.auth_key + "?" + this.url_params;
            this.url_data = this.client.DownloadString(url);
            Console.WriteLine(this.url_data);

            this.data = JsonConvert.DeserializeObject<Dictionary<string, string>[]>(this.url_data);
        }
    }

解析存在此問題:

Newtonsoft.Json.dll中發生了類型為'Newtonsoft.Json.JsonSerializationException'的未處理異常

附加信息:無法將當前JSON對象(例如{“ name”:“ value”})反序列化為類型'System.Collections.Generic.Dictionary`2 [System.String,System.String] []',因為該類型需要JSON數組(例如[1,2,3])可正確反序列化。

要解決此錯誤,可以將JSON更改為JSON數組(例如[1,2,3]),也可以更改反序列化類型,使其成為普通的.NET類型(例如,不像整數這樣的原始類型,也不像這樣的集合類型。數組或列表),可以從JSON對象反序列化。 還可以將JsonObjectAttribute添加到類型中,以強制其從JSON對象反序列化。

路徑“響應”,第1行,位置12。

謝謝你的幫助! :)

JSON是一個對象,在C#中可以將其反序列化為Dictionary<string, object> 但是,您嘗試將其反序列化為數組,而絕對沒有數組。

您需要將其更改為:

public Dictionary<string, object>[] data;

// ...

JsonConvert.DeserializeObject<Dictionary<string, object>>(this.url_data);

同時,即使更改了它,您也將無法訪問嵌套對象。

當你寫的時候

我不想創建一個實例化該對象的類,因為可能會有更多帶有許多返回對象類型的調用,例如錦標賽,團隊,用戶等。

我可能建議使用dynamic

dynamic data = JsonConvert.DeserializeObject(this.url_data);

然后,您將可以像處理動態對象一樣使用它:

var err = data.error;

同時,創建一個類來描述此模型並用於反序列化此JSON對我來說聽起來更好。

Yeldar Kurmangaliyev的答案的替代方案是使用內置的LINQ to JSON.NET庫的JSON支持:

JObject jObject = JObject.Parse("-- JSON STRING --");

JToken response = jObject["response"];

bool error = jObject["error"].Value<bool>();

有很多擴展方法可以輕松解析json字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM