gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:13:32 24 4
gpt4 key购买 nike

我有类 foo,它扩展了 DynamicObject 类。该类还包含一个 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;

}

现在我提到,在序列化它时我得到了空白对象。下面是序列化代码:

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

如果我遗漏了什么,请告诉我?

最佳答案

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

您可以让该方法返回您需要的内容,或者更好的是,只用 JsonProperty 标记 PropertiesCount - 然后它们将无论如何都要序列化:

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

关于c# - 无法将扩展 DynamicObject 的类序列化为 JSON 字符串。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com