【问题标题】:ASP.NET Web API - How to deserialize a JSONASP.NET Web API - 如何反序列化 JSON
【发布时间】:2014-04-27 08:52:06
【问题描述】:

我正在尝试使用 API。

我想将以下请求存储在对象中:http://api.swissunihockey.ch/rest/v1.0/clubs/655
问题是,对象已初始化,但所有值均为空。

我可以接收数据并以字符串形式生成输出。但是对象的反序列化不起作用。你能帮忙吗?

private static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://api.swissunihockey.ch/rest/v1.0/clubs/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        try
        {
            HttpResponseMessage response = await client.GetAsync("615");
            var club = await response.Content.ReadAsAsync<Club>();
            Console.WriteLine(club.Name);
            Console.Read();
        }
        catch (HttpRequestException e)
        {
            if (e.Source != null)
            {
                Console.WriteLine("HttpRequestException source: {0}", e.Source);
            }
        }
    }
}

这是我要存储数据的 Club 类:

class Club
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Street { get; set; }
    public string Zip { get; set; }
    public string City { get; set; }
    public string Canton { get; set; }
    public string Phone { get; set; }
    public string Url { get; set; }
}

【问题讨论】:

  • 请参阅此link。类似于你的问题
  • 谁能解释一下await client.GetAsync("615");这一行。 615代表什么?
  • “615”代表Rest API中对象的ID

标签: c# asp.net json rest asp.net-web-api


【解决方案1】:

尝试查看微软相关文档:

http://msdn.microsoft.com/en-us/library/hh674188.aspx

您需要创建一个数据合约,然后使用该合约处理请求。

例如,对于您而言,数据合同可能类似于:

    [DataContract]
    class Club
    {
        [DataMember(Name = "Id")]
        public int Id { get; set; }
        [DataMember(Name = "Name")]
        public string Name { get; set; }
        [DataMember(Name = "Street")]        
        public string Street { get; set; }
        [DataMember(Name = "Zip")]
        public string Zip { get; set; }
        [DataMember(Name = "City")]
        public string City { get; set; }
        [DataMember(Name = "Canton")]
        public string Canton { get; set; }
        [DataMember(Name = "Phone")]
        public string Phone { get; set; }
        [DataMember(Name = "Url")]
        public string Url { get; set; }
    }

然后查看文档的“处理请求”一章来处理您的数据。

【讨论】:

  • 您无需创建数据合约即可使用 REST api。事实上,数据契约打破了 RESTful 将松散的服务器作为客户端的理念。
  • 服务消费时,“松散的服务器和客户端”会不会起作用?
【解决方案2】:

您需要另一个包含 Club 的类,该类将被进一步反序列化。

class Response
{
    public Club Club { get; set; }
}

然后反序列化为

var res = await response.Content.ReadAsAsync<Response>();
var club = res.Club;

【讨论】:

  • @Loki,你能解释一下await client.GetAsync("615");这一行吗?
【解决方案3】:

从响应中获得字符串后,使用 Web API 已经从 Nuget、Json.Net by Newtonsoft.Json1 引用的包,并调用 Club c = JsonConvert.Deserialize&lt;Club&gt;(responseString);

我发现这比已经提到的内置数据协定要简单得多。

【讨论】:

  • 实际上结合 DRK 答案和你的代码行 Club c = JsonConvert.Deserialize&lt;Club&gt;(responseString); 对我有用。
猜你喜欢
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多