如何将JSON的值映射到不同名称的模型属性?

4

如何使用HttpClient库将JSON属性值映射到不同名称的模型属性,使用.NET 4.5.1框架和C#编程语言?

我正在使用Weather Underground的API,并创建了一个控制台应用程序来测试它,然后再将其移植到ASP.NET MVC 5 Web应用程序中。

static void Main(string[] args)
{
     RunAsync().Wait();
}

static async Task RunAsync()
{
     string _address = "http://api.wunderground.com/api/{my_api_key}/conditions/q/CA/San_Francisco.json";

     using (var client = new HttpClient())
     {
          try
          {
               HttpResponseMessage response = await client.GetAsync(_address);
               response.EnsureSuccessStatusCode();

               if (response.IsSuccessStatusCode)
               {
                    Condition condition = await response.Content.ReadAsAsync<Condition>();
               }
               Console.Read();
          }
          catch (HttpRequestException e)
          {
               Console.WriteLine("\nException Caught!");
               Console.WriteLine("Message :{0} ", e.Message);
          }
     }
}

我的模型类到这里,我需要填充数据:

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

public class Response
{
     public string Terms { get; set; }
}

我的部分JSON结果:

{
     "response": {
          "version":"0.1",
          "termsofService":"http://www.wunderground.com/weather/api/d/terms.html",
          "features": {
               "conditions": 1
          }
     }
}

这是一个非常基本的例子,但是我该如何将JSON返回的termsofservice值映射到我的响应类中的Terms属性呢?如果可能的话,我希望在使用上述库的范围内,而不是解决第三方库,如JSON.NET。如果无法完成,则将查看第三方库。
我可以创建具有与JSON返回的数据属性相同名称的属性的类,但是我喜欢遵循最佳实践来命名属性,并且这些属性需要具有良好的名称。

1
你的代码中没有展示任何 JSON 库。你使用了什么来反序列化 JSON? - Sam Axe
为什么被点赞了?看一下代码就会明白:Condition condition = await response.Content.ReadAsAsync<Condition>(); - Brendan Vogt
1个回答

14

也许有点晚了,但以供参考。

您可以使用System.Runtime.Serialization中的DataMember属性映射json变量名称。将类标记为DataContract。请注意,使用此方法时,要从json字符串映射的每个变量都必须具有DataMember属性,而不仅仅是具有自定义映射的变量。

using System.Runtime.Serialization;

[DataContract]
public class Response
{
    [DataMember(Name = "conditions")]
    public string Terms { get; set; }

    [DataMember]
    public string Foo { get; set; }

    public int Bar { get; set; } // Will not be mapped
}

3
这些属性会被 HttpClient 自动识别吗?我认为问题中的 HttpClient 是由 Asp.Net.WebApi.Client 包扩展的,该包在内部使用 Newtonsoft.Json。因此,我猜我们可以使用 [JsonProperty(PropertyName = "xxxx")] 属性来解决这个问题。 - Gen.L

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