【发布时间】:2016-10-11 09:09:45
【问题描述】:
我使用以下类通过两个 ASP.NET 服务交换 JSON 数据:
[DataContract]
public class Filter
{
[DataMember]
public string Name {get; set;}
[DataMember]
public FilterOperator Operator {get; set;}
[DataMember]
public object Value {get; set;}
}
问题来了:如果我在Value 中设置DateTime,它将被反序列化为字符串:
Value = "/Date(1476174483233+0200)/"
这可能是因为反序列化器在最初序列化时不知道值的类型:
JSON = {"Value":"\/Date(1476174483233+0200)\/"}
正如here 所解释的,DataContractJsonSerializer 在__type 属性的帮助下支持多态性。
我尝试在类的顶部添加[KnownType(typeof(DateTime))] 属性,但没有帮助。
但是,如果我在 Value 属性内设置一个 Tuple<DateTime>(以及类上的适当 KnownType 属性),它就可以工作(正确反序列化的值):
Value = {(10/11/2016 10:49:30 AM)}
在 JSON 内部,发出 __type
JSON = {
"Value": {
"__type" : "TupleOfdateTime:#System",
"m_Item1" : "\/Date(1476175770028+0200)\/"
}
}
有没有办法强制DataContractJsonSerializer 发出正确的信息以正确序列化/反序列化DateTime(这意味着我在序列化后得到DateTime 而不是字符串)?
我尝试在DataContractJsonSerializerSettings 中设置EmitTypeInformation = EmitTypeInformation.Always,但没有帮助。
【问题讨论】:
-
可以修改
Filter类吗? -
可以,可以改。
标签: c# asp.net json polymorphism datacontractjsonserializer