调用REST URL时,我的代码工作正常:
http://api.feedzilla.com/v1/categories.json
http://api.feedzilla.com/v1/categories.json
但当我调用以下URL时,我收到错误:
http://api.feedzilla.com/v1/categories/15/articles.json?count=36&since=2012-11-15&client_source=&order=relevance&title_only=0&
错误:
{"Cannot deserialize the current JSON object (e.g. {\"name\":\"value\"}) into type 'System.Collections.Generic.IEnumerable`1[Nitin.News.DAL.Resources.Article]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.\r\nTo fix this error either change the JSON to a JSON array (e.g. [1,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer,not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.\r\nPath 'articles',line 1,position 12."}
我的守则如下:
public class Article { public string publish_date { get; set; } public string source { get; set; } public string source_url { get; set; } public string summary { get; set; } public string title { get; set; } public string url { get; set; } } public IEnumerable<Article> Get() { HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://api.Feedzilla.com/v1/"); //Add an Accept header for JSON format. client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // call the REST method HttpResponseMessage response = client.GetAsync("http://api.Feedzilla.com/v1/categories/2/articles.json??count=36&since=2012-11-15&client_source=&order=relevance&title_only=0&").Result; // Blocking call! if (response.IsSuccessStatusCode) { // Parse the response body. Blocking! return response.Content.ReadAsAsync<IEnumerable<Article>>().Result; //wont work //string JSON =response.Content.ReadAsStringAsync().Result; //return JsonConvert.DeserializeObject<IEnumerable<T>>(JSON); } else { throw new Exception(string.Format("Data access faild,{0} ({1}) method:{2}",(int)response.StatusCode,response.ReasonPhrase,MethodURL)); } }
解决方法
你的对象层次需要另一个级别…即包含IEnumerable的根.
在http://json2csharp.com/运行JSON到工具会生成以下代理类:
public class Enclosure { public int length { get; set; } public string media_type { get; set; } public string uri { get; set; } } public class Article { public string author { get; set; } public string publish_date { get; set; } public string source { get; set; } public string source_url { get; set; } public string summary { get; set; } public string title { get; set; } public string url { get; set; } public List<Enclosure> enclosures { get; set; } } public class RootObject { public List<Article> articles { get; set; } public string description { get; set; } public string syndication_url { get; set; } public string title { get; set; } }
您只需将代码更改为:
// Parse the response body. Blocking! return response.Content.ReadAsAsync<RootObject>().Result.articles;
显然剥去了你不需要的任何属性.只是想我会出于兴趣向他们展示.