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

.NET Core 3.1中Dictionary<Guid,string>集合类型不支持问题排查

错误原因

.NET Core 3.1开始,ASP.NET Core默认使用System.Text.Json作为JSON序列化组件,而你之前的.NET Core 2.2项目依赖的是Newtonsoft.Json(Json.NET)。System.Text.Json在3.1版本中不支持直接序列化键为非字符串类型(比如Guid)的Dictionary集合,当控制器返回List<Dictionary<Guid, string>>时,序列化器无法处理Guid类型的字典键,因此抛出NotSupportedException。

解决方法

以下是几种可行的解决方案:

1. 切换回Newtonsoft.Json

这是最快捷的兼容方案,继续使用旧项目依赖的序列化器:

  • 安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  • 在Startup.cs的ConfigureServices方法中配置:
    services.AddControllers()
            .AddNewtonsoftJson(); // 替换默认的System.Text.Json
    

2. 自定义System.Text.Json转换器

如果想继续使用System.Text.Json,可以编写自定义转换器处理Guid键的字典:

  • 实现转换器类:
    public class GuidKeyDictionaryConverter : JsonConverter<Dictionary<Guid, string>>
    {
        public override Dictionary<Guid, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            var dict = new Dictionary<Guid, string>();
            using (var doc = JsonDocument.ParseValue(ref reader))
            {
                foreach (var property in doc.RootElement.EnumerateObject())
                {
                    if (Guid.TryParse(property.Name, out var guid))
                    {
                        dict.Add(guid, property.Value.GetString());
                    }
                }
            }
            return dict;
        }
    
        public override void Write(Utf8JsonWriter writer, Dictionary<Guid, string> value, JsonSerializerOptions options)
        {
            writer.WriteStartObject();
            foreach (var pair in value)
            {
                writer.WriteString(pair.Key.ToString(), pair.Value);
            }
            writer.WriteEndObject();
        }
    }
    
  • 注册转换器到序列化配置:
    services.AddControllers()
            .AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.Converters.Add(new GuidKeyDictionaryConverter());
            });
    
    或者直接给返回的字典类型添加特性:[JsonConverter(typeof(GuidKeyDictionaryConverter))]

3. 修改返回类型

调整返回数据的结构,避开非字符串键的字典:

  • 方案A:将Dictionary<Guid, string>替换为List<KeyValuePair<Guid, string>>
  • 方案B:自定义实体类替代字典:
    public class GuidStringPair
    {
        public Guid Id { get; set; }
        public string Value { get; set; }
    }
    
    控制器返回List<GuidStringPair>即可被System.Text.Json正常序列化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:32:17