You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动