You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Http.GetFromJsonAsync忽略DataMember属性,如何自定义JSON属性映射?

问题解决方法

1. 为什么myDate无法映射到Date属性

Http.GetFromJsonAsync默认使用System.Text.Json处理序列化/反序列化,你当前使用的[DataContract]和[DataMember]是WCF框架下DataContractSerializer的特性,System.Text.Json不识别这类标记,因此导致字段映射失效。另外你的JSON数据中同时存在myDate和date两种字段名,也需要额外处理兼容逻辑。

2. 正确的字段映射方案(适配System.Text.Json)

直接使用System.Text.Json专属的[JsonPropertyName]特性,它既可以指定JSON字段与C#属性的对应关系,支持多别名兼容,也能实现长属性名对应短JSON键的需求。

基础映射版本(仅处理myDate)

public class WeatherForecast
{
    // 指定JSON字段名myDate映射到C#的Date属性
    [JsonPropertyName("myDate")]
    public DateOnly Date { get; set; }

    // 长属性名对应短JSON键示例:TemperatureC对应tempC
    [JsonPropertyName("tempC")]
    public int TemperatureC { get; set; }

    [JsonPropertyName("summary")]
    public string? Summary { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

兼容myDate和date的版本

如果需要同时识别JSON中的myDate和date字段,可以添加私有辅助属性做兼容:

public class WeatherForecast
{
    public DateOnly Date { get; set; }

    // 映射JSON的myDate字段
    [JsonPropertyName("myDate")]
    private DateOnly? MyDateSetter
    {
        set => Date = value ?? Date;
    }

    // 映射JSON的date字段
    [JsonPropertyName("date")]
    private DateOnly? DateSetter
    {
        set => Date = value ?? Date;
    }

    [JsonPropertyName("tempC")]
    public int TemperatureC { get; set; }

    [JsonPropertyName("summary")]
    public string? Summary { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

3. 验证反序列化代码

保持原有调用逻辑即可,System.Text.Json会自动识别[JsonPropertyName]标记:

forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");

4. 减小JSON体积的实用技巧

  • 用[JsonPropertyName]给长属性指定极简的JSON键名,比如MyVeryLongNameProperty对应mvlp
  • 服务端返回JSON时启用Gzip/Brotli压缩,进一步降低传输体积
  • 只保留业务必需的JSON字段,剔除冗余数据

内容的提问来源于stack exchange,提问作者Rémy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:12:59