You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:27:03