无法将将DynamicObject扩展为JSON字符串的类序列化。

时间:2018-04-06 08:26:24

标签: c# .net json serialization json.net

我有一个扩展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);
}

如果我错过了什么,请告诉我?

1 个答案:

答案 0 :(得分:4)

JSON.NET以特殊方式处理动态对象。 DynamicObject具有GetDynamicMemberNames方法,该方法应返回该对象的属性名称。 JSON.NET将使用此方法并使用其返回的名称序列化属性。由于您没有覆盖它(或者如果您没有 - 它不会从中返回PropertiesCount属性的名称) - 它们不会被序列化。

你可以让这个方法返回你需要的东西,或者更好的是,只需用Properties标记CountJsonProperty - 然后它们将被序列化:

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