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

ASP.NET Core中JsonConverter接收请求时existingValue为null问题排查

问题分析与解决方法

兄弟,你这问题的核心是对ReadJson方法的参数理解完全错了!existingValue根本不是客户端发送的JSON值——这个参数的作用是当你要把JSON反序列化到一个已经存在的对象实例时,传入那个实例(比如更新现有对象属性),而客户端传过来的短Guid字符串其实存在reader.Value里。

修正后的ShortGuidConverter代码

直接替换你的ReadJson方法,同时完善空值处理和可空Guid的兼容逻辑:

public class ShortGuidConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        // 更简洁的写法,兼容Guid和可空Guid两种类型
        return typeof(Guid).IsAssignableFrom(Nullable.GetUnderlyingType(objectType) ?? objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 读取客户端实际传递的短Guid字符串
        var shortGuidStr = reader.Value as string;
        
        // 处理空值场景(对应Guid?的null情况)
        if (string.IsNullOrWhiteSpace(shortGuidStr))
        {
            // 目标类型是可空Guid就返回null,否则返回Guid.Empty(可根据业务需求调整)
            return objectType == typeof(Guid?) ? null : (object)Guid.Empty;
        }

        try
        {
            // 补全Base64后缀,转换为Guid
            var base64Value = shortGuidStr + "==";
            var bytes = Convert.FromBase64String(base64Value);
            var guid = new Guid(bytes);
            
            // 根据目标类型返回对应的装箱值
            return objectType == typeof(Guid?) ? (object)guid : guid;
        }
        catch (FormatException ex)
        {
            // 抛出友好的序列化异常,方便模型验证捕获
            throw new JsonSerializationException($"无效的短Guid格式:{shortGuidStr}", ex);
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // 你原来的序列化逻辑是正确的,直接保留即可
        Guid? guid = (Guid?)value;
        if (!guid.HasValue)
        {
            writer.WriteNull();
        }
        else
        {
            string base64Value = Convert.ToBase64String(guid.Value.ToByteArray());
            base64Value = base64Value.Substring(0, base64Value.Length - 2);
            writer.WriteValue(base64Value);
        }
    }
}

额外注意事项

  • 模型验证增强:建议给CategoryCreateOrUpdateCommand的Id属性加正则验证,提前拦截无效格式:
    [RegularExpression(@"^[A-Za-z0-9+/]{22}$", ErrorMessage = "Id必须是有效的短Guid格式")]
    public Guid? Id { get; set; }
    
  • 绑定器冲突排查:你在MvcCore配置里添加了ShortGuidBindingProvider,如果这个绑定器也是处理Guid类型的,可能会和JsonConverter冲突。如果只是处理JSON请求的反序列化,这个BindingProvider可以考虑移除(除非你需要处理URL参数里的短Guid)。
  • Newtonsoft.Json版本适配:确认项目使用的是Newtonsoft.Json(你的配置里用了AddJsonFormatters,ASP.NET Core 3.0+默认用System.Text.Json,但当前配置是正确的),如果后续切换到System.Text.Json,Converter的写法会有所不同。

内容的提问来源于stack exchange,提问作者Peter Morris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:47:49