2012-11-17 16 views
6



mój kod działa poprawnie, gdy wywołanie REST URL:
http://api.feedzilla.com/v1/categories.jsonASP.NET Web API Response odlewania HTTP tablicy json

ale gdy zgłoszę następujący adres URL otrzymuję błąd:
http://api.feedzilla.com/v1/categories/15/articles.json?count=36&since=2012-11-15&client_source=&order=relevance&title_only=0&

błąd:

{"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,2,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."} 

mój kod wygląda następująco:

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)); 
     } 
    } 

Odpowiedz

14

Potrzebujesz innego poziomu w hierarchii obiektów ... to jest root, aby pomieścić IEnumerable.

Runing JSON do narzędzia w http://json2csharp.com/ generuje następujące klasy Proxy:

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; } 
} 

Trzeba tylko zmienić swój kod to wtedy:

// Parse the response body. Blocking! 
return response.Content.ReadAsAsync<RootObject>().Result.articles; 

Oczywiście rozebrać się żadnych właściwości dont potrzeba. Pomyślałem, że pokażę im wszystko, co nie będzie dla nich interesujące.

+0

Dziękuję za odpowiedź, ale niestety otrzymuję ten sam komunikat o błędzie. –

+0

@NitinJS Przykro mi to słyszeć. Przetestowałem kod i po usunięciu błędu rozwiązałem go. Mogę przesłać pełny projekt roboczy, jeśli chcesz? Czy zmieniłeś ten wiersz kodu? esponse.Content.ReadAsAsync ()? –

+0

Cześć, dziękuję, twój kod zadziałał: D zmienił typ zwrotu z 'IEnumerable ' na 'T' –