我们最近遇到了一个奇怪的问题,即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
和这个特殊字符串发生了什么?
答案 0 :(得分:3)
事实证明,DataContractJsonSerializer
期望JSON字符串中的所有属性按字母顺序排列,如果它们没有大写。将数据更改为
{
"Address":"123 Maple Avenue",
"latitude":45.421530,
"longitude":-75.697193
"Name":"My Awesome Hotel",
"Phone":"+15550001212",
"PostalCode":"",
"Province":"ON",
}
使对象完全反序列化。
(保留相同顺序的属性并将'L'大写也按预期工作)
答案 1 :(得分:2)