C# JSON反序列化属性映射:用JsonConverter还是自定义反序列化方法?
嘿,你的理解完全正确——就是要把JSON响应里的customer_first_name映射到Person类的First属性,customer_last_name映射到Last属性。
其实你根本不需要写JsonConverter或者自定义反序列化方法,最简单直接的方案是用JsonProperty特性,这也是处理这类字段名映射最常用的方式。
首选方案:使用
JsonProperty特性 只需要在Person类的属性上加上[JsonProperty]特性,指定对应的JSON字段名就行,代码示例如下:
using Newtonsoft.Json; // 如果用Newtonsoft.Json(Json.NET) // 或者用System.Text.Json里的JsonPropertyName,如果是.NET Core/.NET 5+自带的序列化器 class Person { // Newtonsoft.Json的写法 [JsonProperty("customer_first_name")] public string First { get; set; } [JsonProperty("customer_last_name")] public string Last { get; set; } // 如果用System.Text.Json,替换成下面的特性 // [JsonPropertyName("customer_first_name")] // public string First { get; set; } // [JsonPropertyName("customer_last_name")] // public string Last { get; set; } }
这样不管是用Newtonsoft.Json还是.NET自带的System.Text.Json,反序列化的时候都会自动把对应的JSON字段映射到Person的属性上,完全不需要额外写复杂的逻辑。
什么时候需要用
JsonConverter或自定义反序列化? 只有当你遇到更复杂的映射逻辑时,比如:
- 需要对字段值进行转换(比如字符串转枚举、日期格式特殊处理)
- 同一个JSON字段要映射到多个属性,或者需要动态判断映射规则
- 全局范围内有大量类似的字段名转换规则(比如所有带
customer_前缀的字段都要去掉前缀映射)
这种情况下才考虑写自定义的JsonConverter或者自定义反序列化方法。比如用Newtonsoft.Json的自定义Converter示例(简单版):
public class PersonConverter : JsonConverter<Person> { public override Person ReadJson(JsonReader reader, Type objectType, Person existingValue, bool hasExistingValue, JsonSerializer serializer) { var jsonObj = JObject.Load(reader); return new Person { First = jsonObj["customer_first_name"]?.ToString(), Last = jsonObj["customer_last_name"]?.ToString() }; } public override void WriteJson(JsonWriter writer, Person value, JsonSerializer serializer) { // 如果需要序列化的话,这里写对应的逻辑 var jsonObj = new JObject { ["customer_first_name"] = value.First, ["customer_last_name"] = value.Last }; jsonObj.WriteTo(writer); } }
然后在反序列化的时候指定这个Converter:
var person = JsonConvert.DeserializeObject<Person>(jsonString, new PersonConverter());
但回到你的场景,显然用JsonProperty特性是最省心高效的选择,没必要用复杂的方案。
内容的提问来源于stack exchange,提问作者sazr




