2012-11-17 23 views
6



Benim Kod çalışıyor:
http://api.feedzilla.com/v1/categories.jsonASP.NET Web API döküm http yanıtın

ama URL'yi aşağıdaki çağrı zaman olsun hatası:
http://api.feedzilla.com/v1/categories/15/articles.json?count=36&since=2012-11-15&client_source=&order=relevance&title_only=0&

Hata:

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

Benim Kod aşağıdaki gibidir:

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

cevap

14

Nesne hiyerarşinizde başka bir düzeye ihtiyacınız var ... yani IEnumerable'ı içeren bir kök.

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

Açıkçası yok herhangi özelliklerini çıkarmaz: Sadece o zaman bu için kodunuzu değiştirmeniz gerekir

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

: http://json2csharp.com/ de aracı haline JSON Basamak

aşağıdaki proxy sınıfları oluşturur gerekir. Sadece onların ilgilerini çekeceğini düşündüm.

+0

Cevabınız için teşekkürler, ancak maalesef aynı hata mesajını alıyorum. –

+0

@NitinJS bunu duyduğuma üzüldüm. Kodu test ettim ve hatayı çözmekten hata yaptım. İsterseniz tam çalışma projesini yükleyebilir miyim? Bu kod satırını değiştirdin mi? esponse.Content.ReadAsAsync ()? –

+0

Merhaba, Teşekkürler, kodunuz işe yaradı: D, "IEnumerable " ile "T" –