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
相关产品推荐
相关产品推荐

