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

