ASP.NET Web API - 如何反序列化JSON

6
我试图调用API。

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

我可以接收数据并将其生成字符串输出。但反序列化到对象中不起作用。能否提供帮助?
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);
            }
        }
    }
}

这是我正在尝试存储数据的俱乐部类:
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; }
}

请参考此链接(https://dev59.com/rGUq5IYBdhLWcg3wKtbs),该链接与您的问题类似。 - Jegadeesh
有人能解释一下这行代码 await client.GetAsync("615"); 吗? 615代表什么? - Maddy
"615"代表Rest API中对象的ID。 - RobinXSI
3个回答

3

一旦您从响应中获得字符串,使用Web API已经从Nuget引用的包Json.Net by Newtonsoft.Json1,并调用Club c = JsonConvert.Deserialize<Club>(responseString);

我认为这比已经提到的内置数据合同简单得多。


实际上,DRK的答案和你的代码行Club c = JsonConvert.Deserialize<Club>(responseString);对我很有帮助。 - DanielV

3

你需要另一个包含Club类的类,以便进一步反序列化。

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

然后将其反序列化为:
var res = await response.Content.ReadAsAsync<Response>();
var club = res.Club;

@Loki,你能解释一下这行代码的含义吗?await client.GetAsync("615"); - Maddy

0

尝试查看与微软相关的文档:

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

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

3
您不需要为使用REST API创建数据契约。事实上,数据契约违反了RESTful的理念,即具有松散的服务器和客户端。 - diegosasw
当服务被消费时,“松散的服务器和客户端”不会发挥作用吗? - user609926

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接