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

C#自定义字典类的JSON序列化与反序列化问题求助

解决动态JSON的C#类序列化/反序列化问题

核心思路:别继承IDictionary,用普通类+扩展数据特性

继承IDictionary会让序列化器把你的类当成纯字典处理,直接忽略固定属性,反序列化还会把固定字段塞进字典导致冲突。换普通类配合序列化器的扩展数据特性就能解决问题。

Newtonsoft.Json 实现方式

直接定义普通类,用[JsonExtensionData]标记一个私有字典来接收动态键值对,同时保留固定的Id和Properties:

public class Dataset
{
    public string Id { get; set; }
    public Dictionary<string, object> Properties { get; set; }

    // 用这个字典存所有未匹配的动态键
    [JsonExtensionData]
    private Dictionary<string, JToken> _dynamicFields;

    // 加个索引器,方便像字典一样直接访问动态字段
    public object this[string key]
    {
        get => _dynamicFields.TryGetValue(key, out var value) ? value.ToObject<object>() : null;
        set => _dynamicFields[key] = JToken.FromObject(value);
    }
}

序列化时,固定属性和动态字段会一起输出;反序列化时,Id和Properties会被正确解析到对应属性,剩下的动态键自动进_dynamicFields,不会产生冲突。

System.Text.Json 实现方式

逻辑和Newtonsoft一致,只是扩展数据字典的类型要换成Dictionary<string, JsonElement>:

public class Dataset
{
    public string Id { get; set; }
    public Dictionary<string, object> Properties { get; set; }

    [JsonExtensionData]
    private Dictionary<string, JsonElement> _dynamicFields;

    // 索引器实现,方便访问动态字段
    public object this[string key]
    {
        get => _dynamicFields.TryGetValue(key, out var value) ? value.Deserialize<object>() : null;
        set => _dynamicFields[key] = JsonSerializer.SerializeToElement(value);
    }
}

同样,序列化时固定属性和动态字段会被正确输出,反序列化时也能准确区分固定属性和动态键,不会出现解析失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:21:05