如何将空字符串反序列化为CustomType实例而非null?(Newtonsoft JSON)
解决Newtonsoft.Json空字符串反序列化为对象实例的问题
Newtonsoft.Json默认会将空字符串视为无效JSON,直接返回null。要实现空字符串反序列化为CustomType的新实例,你需要正确编写并注册自定义JSON转换器,以下是可行方案:
1. 编写通用空字符串转实例转换器
创建一个泛型转换器,处理所有具备无参构造函数的类型:
public class EmptyStringToInstanceConverter<T> : JsonConverter where T : new() { public override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 空字符串解析时,Reader的TokenType为JsonToken.None,直接返回新实例 if (reader.TokenType == JsonToken.None) { return new T(); } // 非空JSON时正常反序列化 return serializer.Deserialize<T>(reader); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 序列化逻辑保持默认即可 serializer.Serialize(writer, value); } }
2. 注册转换器的两种方式
方式一:通过特性标记目标类
直接在CustomType上添加转换器特性,全局生效:
[JsonConverter(typeof(EmptyStringToInstanceConverter<CustomType>))] public class CustomType { public int Id { get; set; } public string Name { get; set; } } // 调用测试 var result = JsonConvert.DeserializeObject<CustomType>(""); // result 为新的CustomType实例,而非null
方式二:序列化时指定转换器
如果不想修改类定义,可在调用时通过JsonSerializerSettings传入转换器:
var settings = new JsonSerializerSettings { Converters = { new EmptyStringToInstanceConverter<CustomType>() } }; var result = JsonConvert.DeserializeObject<CustomType>("", settings);
常见问题排查
你之前自定义ReadJson未生效,大概率是以下原因:
- 未正确判断
JsonToken.None状态(空字符串解析时的Token类型) CanConvert方法未返回true(未匹配目标类型)- 未正确注册转换器(既没加特性,也没在设置中添加)
内容的提问来源于stack exchange,提问作者Kaushik Ravi
相关产品推荐
相关产品推荐

