我目前遇到一个问题,当我序列化一个派生自包含Dictionary属性的基类的类时,重复的属性被序列化为JSON。
派生类包含具体的属性定义,并且基类中的字典在运行时包含同名的属性。在序列化时,生成的JSON字符串将包含两个相同的属性,它是无效的JSON,并将使反序列化器绊倒。
我需要一种通用的方法,使派生类的具体实现属性优先于从base派生的基类Dictionary属性中包含的任何内容。
序列化后的示例JSON:
{ "myProperty": "I should have precedence", "myProperty": "I shouldn't be here!" }
类定义如下所示:
public class Base
{
[JsonExtensionData]
public Dictionary<string, object> Properties { get; set; }
}
public class Child : Base
{
[JsonProperty("myProperty")]
public string MyProperty { get; set; }
}
示例用法:
static void Main(string[] args)
{
Child child = new Child()
{
Properties = new Dictionary<string, object>() { { "myProperty", "I shouldn't be here!" } }
};
child.MyProperty = "I should have precedence";
string serializedObject = JsonConvert.SerializeObject(child);
Console.WriteLine(serializedObject); // duplicates are present!
}
我希望使用基本字典加载动态json属性和值,并且在任何派生类中都可以访问它。如果派生类具有具体实现,则派生类属性实现应优先。
我的印象是JsonExtensionData会配置Json.Net序列化程序来执行此操作。
使用条件序列化可以起作用,但似乎只能设置是否可以序列化公共属性而不是属性字典中的各个键值对。
ShouldSerializeProperties()
{
// reflect over class properties
// store reflected property names in a list
// iterate over reflected property names and check to see if each property
// name exists as a key in the Properties Dictionary
// set return value
// once loop finished, return the return value
}
基本上,在对属性值进行选择性序列化之后,上面的示例不起作用,因为序列化程序不会将属性字典中的任何动态属性键值对序列化为ShouldSerializeMyProperty适用于整个属性 - 应该如此。任何帮助将不胜感激!