我有一个扩展DynamicObject类的类foo。 该类还包含Dictionary类型的属性。
当我尝试使用Newton.Soft Json转换器序列化它时。我将“{}”作为空白对象。
以下是我的代码:
public class Foo: DynamicObject
{
/// <summary>
/// Gets or sets the properties.
/// </summary>
/// <value>The properties.</value>
public Dictionary<string, object> Properties { get; set; } = new Dictionary<string, object>();
/// <summary>
/// Gets the count.
/// </summary>
/// <value>The count.</value>
public int Count => Properties.Keys.Count;
}
现在我提到了,在序列化时我得到了空白对象。 Follwing是序列化的代码:
public static void Main()
{
Foo foo= new Foo();
foo.Properties = new Dictionary<string, object>()
{
{"SomeId", 123},
{"DataType","UnKnonw"},
{"SomeOtherId", 456},
{"EmpName", "Pranay Deep"},
{"EmpId", "789"},
{"RandomProperty", "576Wow_Omg"}
};
//Now serializing..
string jsonFoo = JsonConvert.SerializeObject(foo);
//Here jsonFoo = "{}".. why?
Foo foo2= JsonConvert.DeserializeObject<Foo>(jsonFoo);
}
如果我错过了什么,请告诉我?
答案 0 :(得分:4)
JSON.NET以特殊方式处理动态对象。 DynamicObject
具有GetDynamicMemberNames
方法,该方法应返回该对象的属性名称。 JSON.NET将使用此方法并使用其返回的名称序列化属性。由于您没有覆盖它(或者如果您没有 - 它不会从中返回Properties
和Count
属性的名称) - 它们不会被序列化。
你可以让这个方法返回你需要的东西,或者更好的是,只需用Properties
标记Count
和JsonProperty
- 然后它们将被序列化:
public class Foo : DynamicObject
{
[JsonProperty]
public Dictionary<string, object> Properties { get; set; } = new Dictionary<string, object>();
[JsonProperty]
public int Count => Properties.Keys.Count;
}
// also works, NOT recommended
public class Foo : DynamicObject
{
public Dictionary<string, object> Properties { get; set; } = new Dictionary<string, object>();
public int Count => Properties.Keys.Count;
public override IEnumerable<string> GetDynamicMemberNames() {
return base.GetDynamicMemberNames().Concat(new[] {nameof(Properties), nameof(Count)});
}
}