反序列化JSON时如何将null的Article属性自动设为默认空字符串?
解决JSON反序列化时null字段自动转为空字符串的问题
问题场景
给定JSON数据:
[{"Familiy":"A","Article":null}, {"Familiy":"B","Article":"plant"}]
需反序列化为ObservableCollection<ArticleModel>,模型类定义:
public class ArticleModel { public string Familiy { get; set; } public string Article { get; set; } }
当前使用Newtonsoft.Json的反序列化代码:
var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, }; ObservableCollection<ArticleModel> result = JsonConvert.DeserializeObject<ObservableCollection<ArticleModel>>(jsonString, settings);
遇到的问题:外部接口返回的Article字段为null时,反序列化后该属性仍为null,导致UI绑定失败,需要自动将null转为空字符串。此前尝试的默认值特性、构造函数初始化、切换System.Text.Json均未解决。
可行解决方案
方案1:修改模型属性的Getter(最简单直接)
直接在模型属性的Getter中处理null值,无论使用哪种JSON库都能生效:
public class ArticleModel { private string _article; public string Familiy { get; set; } public string Article { get => _article ?? string.Empty; set => _article = value; } }
方案2:Newtonsoft.Json自定义转换器
创建专门处理字符串null转空的转换器:
public class NullToEmptyStringConverter : JsonConverter<string> { public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer) { return reader.Value?.ToString() ?? string.Empty; } public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer) { writer.WriteValue(value ?? string.Empty); } }
使用方式二选一:
- 全局配置转换器:
var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new NullToEmptyStringConverter() } }; var result = JsonConvert.DeserializeObject<ObservableCollection<ArticleModel>>(jsonString, settings); - 给单个属性标注特性:
public class ArticleModel { public string Familiy { get; set; } [JsonConverter(typeof(NullToEmptyStringConverter))] public string Article { get; set; } }
方案3:System.Text.Json自定义转换器
若使用System.Text.Json,创建对应转换器:
public class NullToEmptyStringConverter : JsonConverter<string> { public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return reader.TokenType == JsonTokenType.Null ? string.Empty : reader.GetString() ?? string.Empty; } public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(value ?? string.Empty); } }
配置并使用:
var options = new JsonSerializerOptions { Converters = { new NullToEmptyStringConverter() } }; var result = JsonSerializer.Deserialize<ObservableCollection<ArticleModel>>(jsonString, options);
内容的提问来源于stack exchange,提问作者galex
相关产品推荐
相关产品推荐

