Newtonsoft.Json不支持FrozenDictionary,求简便序列化方案或现成转换器
解决Newtonsoft.Json对FrozenDictionary的序列化/反序列化支持问题
一、简便实现方法
不用从头编写完整的JsonConverter,可以复用Newtonsoft.Json对Dictionary的内置处理逻辑,只需要写一个轻量转换器做类型中转:
using System.Collections.Frozen; using Newtonsoft.Json; public class FrozenDictionaryConverter<TKey, TValue> : JsonConverter<FrozenDictionary<TKey, TValue>> where TKey : notnull { public override void WriteJson(JsonWriter writer, FrozenDictionary<TKey, TValue>? value, JsonSerializer serializer) { // 将FrozenDictionary转为Dictionary,复用内置序列化逻辑 serializer.Serialize(writer, value?.ToDictionary(kv => kv.Key, kv => kv.Value)); } public override FrozenDictionary<TKey, TValue>? ReadJson(JsonReader reader, Type objectType, FrozenDictionary<TKey, TValue>? existingValue, bool hasExistingValue, JsonSerializer serializer) { // 先反序列化为Dictionary,再转为FrozenDictionary var dict = serializer.Deserialize<Dictionary<TKey, TValue>>(reader); return dict?.ToFrozenDictionary(); } }
使用时两种方式可选:
- 全局注册转换器:
var settings = new JsonSerializerSettings(); settings.Converters.Add(new FrozenDictionaryConverter<string, int>()); // 序列化示例 var frozenDict = FrozenDictionary.Create(new Dictionary<string, int> { { "a", 1 }, { "b", 2 } }); var json = JsonConvert.SerializeObject(frozenDict, settings); // 反序列化示例 var deserialized = JsonConvert.DeserializeObject<FrozenDictionary<string, int>>(json, settings);
- 直接在属性上标记:
public class MyClass { [JsonConverter(typeof(FrozenDictionaryConverter<string, string>))] public FrozenDictionary<string, string>? Data { get; set; } }
这种方式几乎不需要自己实现序列化/反序列化的核心逻辑,仅做类型转换,难度极低。
二、现成的社区解决方案
社区已经有不少针对FrozenDictionary的Newtonsoft.Json转换器实现:
- 部分.NET工具类库会附带对FrozenCollections的Json支持,你可以在开源项目中找到现成的转换器代码;
- NuGet上也有相关包,搜索包含
FrozenDictionary和Newtonsoft.Json关键词的包,部分包提供开箱即用的转换器。
如果不想引入额外依赖,上面的轻量转换器已经可以满足大部分场景需求。
内容的提问来源于stack exchange,提问作者sybil
相关产品推荐
相关产品推荐

