我们最近遇到了一个奇怪的问题,即 JSON 对象的两个属性没有被反序列化。
给定这个类:
[DataContract]
public class Hotel
{
[DataMember]
public string Name { get; set; }
.... other properties
[DataMember]
public string double? Latitude { get; set; }
[DataMember]
public string double? Longitude { get; set; }
.... other properties
}
和一个匹配的 JSON 字符串:
{
"Address":"123 Maple Avenue",
"Name":"My Awesome Hotel",
"Phone":"+15550001212",
"PostalCode":"",
"Province":"ON",
"latitude":45.421530,
"longitude":-75.697193
}
既没有设置latitude
也没有longitude
设置属性。
下面是反序列化代码:
public static object Deserialize(Type concreteType, string serialized)
{
var jsonBytes = Encoding.UTF8.GetBytes(serialized);
using (var jsonReader = JsonReaderWriterFactory.CreateJsonReader
(jsonBytes, XmlDictionaryReaderQuotas.Max))
{
var dcjs = new DataContractJsonSerializer(concreteType);
return dcjs.ReadObject(jsonReader);
}
}
非常令人费解的是,其他具有相同latitutde
/longitude
属性的类被正确反序列化了。需要明确的是:还有其他反序列化 JSON 字符串的类,其中 JSON 中的名称为小写,而 C# 属性为 PascalCase。
(有趣的是,JSON.Net 能够毫无问题地反序列化它)
那么DataContractJsonSerializer
这个特定的字符串发生了什么?