C#不使用自定义转换器时如何在字符串属性为特定值时JSON忽略该属性
不用给每个属性单独写转换逻辑,有两个低维护成本的实现方式:
方案1:配合属性默认值用内置的JsonIgnore规则实现
你提到的三个内置忽略条件里,JsonIgnoreCondition.WhenWritingDefault 不止能识别null值,只要给对应字符串属性显式设置初始默认值为你想要忽略的特定字符串,序列化时属性值等于这个默认值就会被自动忽略。
示例代码:
// 比如你需要忽略Name属性值为"N/A"的场景,直接将该值设为属性的初始化默认值 [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string Name { get; set; } = "N/A";
这个方案的局限是,如果不同属性需要忽略的特定值不一样,得给每个属性单独设初始值、加特性,适合属性量不大、忽略规则和属性业务默认值一致的场景。
方案2:写一次全局字符串转换器(推荐,维护成本最低)
你觉得自定义转换器不实用,应该是担心要给每个属性单独配转换器。实际上你只需要写一个针对string类型的通用转换器,全局注册一次,就能对所有实体的所有字符串属性自动生效,不需要给任何属性加额外特性。
转换器代码只有十几行:
public class IgnoreSpecifiedStringConverter : JsonConverter<string> { // 配置你需要全局忽略的特定字符串值,有多个需要忽略的值可以改成HashSet做集合判断 private const string IgnoreValue = ""; // 示例为忽略空字符串,替换成你需要的特定值即可 public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 反序列化保持默认逻辑,不需要额外处理 return reader.GetString(); } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { // 匹配到要忽略的值时直接跳过,不写入JSON if (value == IgnoreValue) return; writer.WriteStringValue(value); } }
序列化前全局注册一次就行:
var jsonOptions = new JsonSerializerOptions(); jsonOptions.Converters.Add(new IgnoreSpecifiedStringConverter()); // 所有序列化操作传入该配置即可自动生效 var jsonResult = JsonSerializer.Serialize(待序列化的实体对象, jsonOptions);
这个方案一次配置全局生效,哪怕有上百个实体、上千个字符串属性,也不需要做任何额外修改,维护成本几乎为0。如果个别属性需要特殊处理,单独给对应属性加特性或者专属转换器就能覆盖全局规则,灵活性足够。
补充:目前System.Text.Json的内置忽略条件没有开放自定义判断逻辑的入口,以上两个方案是不需要给单个属性编写独立转换逻辑的前提下,成本最低的实现方式。
内容的提问来源于stack exchange,提问作者Harendrra
相关产品推荐
相关产品推荐

