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
相关产品推荐
相关产品推荐

