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

