ASP.NET Web API将http响应转换为json数组

时间:2022-10-10 16:38:06



My Code works fine when calling REST URL:
http://api.feedzilla.com/v1/categories.json

调用REST URL时,我的代码工作正常:http://api.feedzilla.com/v1/categories.json

but when I call following URL I get error:
http://api.feedzilla.com/v1/categories/15/articles.json?count=36&since=2012-11-15&client_source=&order=relevance&title_only=0&

但是,当我调用以下URL时,我收到错误:http://api.feedzilla.com/v1/categories/15/articles.json?count = 36 &ince = 2012-11-15&client_source =&order = relevance&title_only = 0&

Error:

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

My Code is as follows:

我的守则如下:

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

1 个解决方案

#1


14  

You need another level in your object hierachy... i.e. a root to contain the IEnumerable.

你的对象层次需要另一个级别...即包含IEnumerable的根。

Runing the JSON into the tool at http://json2csharp.com/ generates the following proxy classes:

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

You just need to change your code to this then:

您只需将代码更改为:

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

Obviously strip out any properties you dont need. Just thought I would show them all out of interest.

显然剥去了你不需要的任何属性。只是想我会出于兴趣向他们展示。

#1


14  

You need another level in your object hierachy... i.e. a root to contain the IEnumerable.

你的对象层次需要另一个级别...即包含IEnumerable的根。

Runing the JSON into the tool at http://json2csharp.com/ generates the following proxy classes:

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

You just need to change your code to this then:

您只需将代码更改为:

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

Obviously strip out any properties you dont need. Just thought I would show them all out of interest.

显然剥去了你不需要的任何属性。只是想我会出于兴趣向他们展示。