【发布时间】:2014-05-21 01:52:46
【问题描述】:
问题
大家好,
我正在尝试反序列化具有已知(静态)和未知(动态)属性的 Json 字符串。为此,我使用 Json.NET 和 System.Dynamic.DynamicObject。
在我的第一次尝试中,我使用 Json.NET 特定的 Serialization Attributes 来配置(反)序列化程序。但是,在这种情况下,Json 字符串中的动态属性不会被反序列化。但是当我切换到本机 .NET 属性([DataContract] 和 [DataMember])时,动态属性会被反序列化,我可以在创建的动态对象中访问它们。
这种行为是有意的吗?我是否缺少任何具有 Json.NET 属性的配置来获得相同的反序列化行为?
任何澄清将不胜感激!
细节
这里我提供了我的实现细节(使用 Json.NET 属性)。我正在使用 .NET 4.5 和 Json.NET 6.0.2
因为我有多种消息类型,具有静态和动态属性,所以我引入了一个基类,它实现了动态处理属性:
[JsonObject]
internal abstract class DynamicMessage : DynamicObject
{
[JsonProperty]
public Dictionary<string, object> dynamicProperties = new Dictionary<string, object();
public override bool TryGetMember(GetMemberBinder binder, out object result) {...}
public override bool TrySetMember(SetMemberBinder binder, object value) {...}
}
具体的子类如下所示:
[JsonObject]
internal class ItemMessage : DynamicMessage
{
[JsonPropertyAttribute(PropertyName = "id")]
internal long Id;
[JsonPropertyAttribute(PropertyName = "parent_item");
internal long ParentItemId;
...
}
我尝试像这样反序列化以下字符串:
jsonString = @{'id':1,
'parent_item':5,
'my_dynamic_property_1' : 1337,
'my_dynamic_property_2' : 'my_dynamic_property_2'}
JsonSerializer serializer = new JsonSerializer();
dynamic itemMessage = serializer.Deserialize<ItemMessage>(new JsonTextReader(jsonString));
正如我在开始时指出的那样,如果我使用属性[JsonObject] 和[JsonProperty],所有静态属性都会正确反序列化并绑定到 POCO 属性,但我缺少动态属性@ 987654330@和my_dynamic_property_2。
当我更改为[DataContract]([JsonObject])和[DataMember]([JsonProperty])时,Json 中的动态属性也将被反序列化,我可以调用
itemMessage.my_dynamic_property_1; //=1337
itemMessage.my_dynamic_property_2; //="my_dynamic_property_2"
【问题讨论】: