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

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();
    }
}

使用时两种方式可选:

  1. 全局注册转换器:
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);
  1. 直接在属性上标记:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:54:52