2015-11-12 149 views
0

我需要在C#中解析JSON的帮助。有我的JSON字符串,我正试图分析和处理。我不想创建一个类实例化对象,因为可以有更多的呼叫有很多返回的对象类型 - 锦标赛,团队,用户等C#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.JsonSerializationEx ception'发生在 Newtonsoft.Json.dll

附加信息:无法反序列化当前的JSON对象 (例如,因为这个类型需要一个JSON数组(例如[1,2,...,0,{“name”:“value”}),因此类型为 'System.Collections.Generic.Dictionary`2 [System.String,System.String] []' ' 3])正确地反序列化 。

要修复此错误,请将JSON更改为JSON数组(例如 [1,2,3])或更改反序列化类型,以使其成为正常的.NET 类型(例如,不是整数类型的基本类型,而不是类似数组或列表的集合类型 ),它们可以从JSON对象反序列化。 也可以将JsonObjectAttribute添加到该类型中,以强制它从一个JSON对象反序列化为 。

路径 '响应',1号线,位置12

感谢您的帮助! :)

+0

你的JSON中绝对没有数组。 –

回答

0

您的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听起来对我更好。

+0

哦哇,动态..:D谢谢! – TheKronnY

0

替代Yeldar Kurmangaliyev的答案是使用内置的LINQ to JSON支持JSON.NET库:

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

JToken response = jObject["response"]; 

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

有很多的扩展方法,允许JSON字符串容易解析。