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

如何用System.Text.Json实现序列化反序列化不对称字段命名?

解决方案:System.Text.Json 不对称序列化/反序列化实现

不需要单独创建API专用类或使用AutoMapper,利用.NET 8为System.Text.Json新增的[JsonDeserializationName]特性即可实现需求,以下是具体实现方式:

改造Test类

直接在现有属性上同时配置序列化和反序列化的字段名:

class Test 
{
    // 序列化到文件时使用的字段名
    [JsonPropertyName("ValueName")]
    // 从API反序列化时匹配的字段名
    [JsonDeserializationName("ApiValueName")]
    public string ValueName { get; set; }
}

验证效果

  1. 反序列化API返回的JSON:
    处理API返回的{"ApiValueName": "aaaa"}时,JsonSerializer.Deserialize<Test>(json)会自动将ApiValueName的值映射到ValueName属性。
  2. 序列化到文件:
    执行JsonSerializer.Serialize(testInstance)时,会输出{"ValueName": "aaaa"},满足本地存储的字段名要求。

替代方案(兼容低版本.NET)

如果需要兼容.NET 8以下版本,可以实现自定义JsonConverter<Test>手动处理命名逻辑:

public class TestConverter : JsonConverter<Test>
{
    public override Test Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        using var doc = JsonDocument.ParseValue(ref reader);
        return new Test
        {
            ValueName = doc.RootElement.GetProperty("ApiValueName").GetString()
        };
    }

    public override void Write(Utf8JsonWriter writer, Test value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        writer.WriteString("ValueName", value.ValueName);
        writer.WriteEndObject();
    }
}

使用时传入自定义配置:

var options = new JsonSerializerOptions();
options.Converters.Add(new TestConverter());

// 反序列化API数据
var test = JsonSerializer.Deserialize<Test>(apiJson, options);
// 序列化到文件
var fileJson = JsonSerializer.Serialize(test, options);

显然,利用.NET 8原生特性的方案更简洁易维护,是首选实现方式。

内容的提问来源于stack exchange,提问作者xerxos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:55:01