如何用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; } }
验证效果
- 反序列化API返回的JSON:
处理API返回的{"ApiValueName": "aaaa"}时,JsonSerializer.Deserialize<Test>(json)会自动将ApiValueName的值映射到ValueName属性。 - 序列化到文件:
执行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
相关产品推荐
相关产品推荐

