[英]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.