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

如何解决Guid属性传入空值时的转换错误?

解决空字符串无法转换为Guid/Guid?的问题

问题原因

你遇到的错误核心在于:JSON请求体里的"Guid":""是空字符串,而无论是值类型Guid还是可空类型Guid?,JSON序列化器(比如Newtonsoft.Json或System.Text.Json)都无法将空字符串解析为Guid类型——空字符串既不是有效的Guid格式,也不是null(可空Guid仅接受有效Guid字符串或null)。即便改成Guid?,序列化器依然会尝试把空字符串转换成Guid,而非自动识别为null,因此报错。

解决方案

方案1:修改请求体(最简单直接)

将JSON中的空字符串替换为null,这样Guid?就能正常解析:

{"Guid":null,"FirstName":"","LastName":""}

方案2:自定义JSON转换器(不修改请求体)

如果无法调整请求体格式,可以通过自定义转换器让序列化器把空字符串解析为null,再映射到Guid?:

使用Newtonsoft.Json(Json.NET)
  1. 定义自定义转换器:
public class EmptyStringToNullGuidConverter : JsonConverter<Guid?>
{
    public override Guid? ReadJson(JsonReader reader, Type objectType, Guid? existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var value = reader.Value?.ToString();
        if (string.IsNullOrEmpty(value))
            return null;
        
        return Guid.TryParse(value, out var guid) ? guid : null;
    }

    public override void WriteJson(JsonWriter writer, Guid? value, JsonSerializer serializer)
    {
        writer.WriteValue(value?.ToString());
    }
}
  1. 在DTO的Guid属性上标记转换器:
public class PersonDto
{
    [JsonConverter(typeof(EmptyStringToNullGuidConverter))]
    public Guid? Guid { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
使用System.Text.Json
  1. 定义自定义转换器:
public class EmptyStringToNullGuidConverter : JsonConverter<Guid?>
{
    public override Guid? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.String)
        {
            var value = reader.GetString();
            if (string.IsNullOrEmpty(value))
                return null;
            
            return Guid.TryParse(value, out var guid) ? guid : null;
        }
        return null;
    }

    public override void Write(Utf8JsonWriter writer, Guid? value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value?.ToString());
    }
}
  1. 配置序列化器选项(在Startup/Program.cs中):
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new EmptyStringToNullGuidConverter());
    });

方案3:用字符串接收再转换(兼容旧逻辑)

如果不想修改序列化配置,可以把DTO中的Guid属性改为字符串类型,在业务逻辑层再转换为Guid?:

public class PersonDto
{
    public string Guid { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    // 业务层转换方法
    public Guid? ParseGuid()
    {
        if (string.IsNullOrWhiteSpace(Guid))
            return null;
        
        return Guid.TryParse(Guid, out var result) ? result : null;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:43