如何编写JsonConverter实现含单个值的自定义struct的序列化与反序列化
问题原因
你的代码存在两个核心错误,直接导致反序列化失败:
CanConvert方法逻辑错误:该方法需要判断传入的类型是否为Price或可空Price?,你当前写的判断条件是匹配decimal?,完全不符合Converter的适用场景。ReadJson方法实现错误:无参调用serializer.Deserialize(reader)会把JSON中的数字2.3默认解析为double类型,而double无法通过as Price?直接转换为Price结构体,最终返回null,值类型Price接收到null时会赋值默认值default(Price),因此_value为0。
修复方案
直接替换你的PriceConverter代码为如下实现即可:
class PriceConverter : JsonConverter { public override bool CanConvert(Type objectType) { // 匹配Price和可空Price?两种类型 return objectType == typeof(Price) || objectType == typeof(Price?); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // 先读取JSON值为decimal类型 if (reader.Value is decimal val) { return new Price(val); } // 兼容数字为int/double的场景 if (reader.Value is IConvertible convertible) { return new Price(convertible.ToDecimal(null)); } // 处理可空类型为null的情况 if (objectType == typeof(Price?)) { return null; } return default(Price); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 原有序列化逻辑正常,可保留 serializer.Serialize(writer, (decimal)((Price)value)); } }
修改完成后再次运行测试代码,反序列化得到的product2.Price的_value值就会正确为2.3。
内容的提问来源于stack exchange,提问作者kahoona
相关产品推荐
相关产品推荐

