如何在不同场景切换自定义Json转换器与默认转换器
解决方案
完全可以移除DTO上的[JsonConverter]特性,改为通过JsonSerializer.Serialize/Deserialize方法的参数动态指定转换器,以此实现不同场景使用不同的序列化逻辑。
步骤1:移除DTO类上的转换器特性
先把StudentDTO上的[JsonConverter]特性删掉,让类回到无全局绑定转换器的状态:
public class StudentDTO { // 你的属性和原有代码... }
步骤2:分场景配置序列化逻辑
场景A:需要使用自定义转换器
创建JsonSerializerOptions实例,将自定义转换器添加到配置中,再传入序列化/反序列化方法:
// 初始化带自定义转换器的配置 var customSerializeOptions = new JsonSerializerOptions(); customSerializeOptions.Converters.Add(new CustomJsonConverter<StudentDTO>()); // 序列化时使用自定义转换器 string customSerializedJson = JsonSerializer.Serialize(yourStudentDtoInstance, customSerializeOptions); // 反序列化时使用自定义转换器 StudentDTO customDeserializedDto = JsonSerializer.Deserialize<StudentDTO>(jsonString, customSerializeOptions);
场景B:使用默认JSON转换器
直接使用默认的序列化逻辑即可——不需要额外配置,不传JsonSerializerOptions参数就会自动使用内置的默认转换器:
// 默认序列化(无自定义转换器) string defaultSerializedJson = JsonSerializer.Serialize(yourStudentDtoInstance); // 默认反序列化 StudentDTO defaultDeserializedDto = JsonSerializer.Deserialize<StudentDTO>(jsonString);
额外技巧:基于默认配置扩展
如果需要保留默认配置的其他设置(比如驼峰命名、忽略空值等),同时添加自定义转换器,可以基于默认配置克隆后修改:
var extendedOptions = new JsonSerializerOptions(JsonSerializerOptions.Default); extendedOptions.Converters.Add(new CustomJsonConverter<StudentDTO>()); // 可以继续添加其他配置,比如extendedOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
这种方式完全摆脱了特性对DTO类的全局绑定,能灵活根据业务场景选择序列化逻辑,完全满足你的需求。
内容的提问来源于stack exchange,提问作者user16963532
相关产品推荐
相关产品推荐

