为什么DataContractJsonSerializer会跳过反序列化某些属性?

时间:2013-08-12 15:27:56

标签: c# .net json json.net

我们最近遇到了一个奇怪的问题,即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
}

latitudelongitude属性均未设置。

这是反序列化代码:

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和这个特殊字符串发生了什么?

2 个答案:

答案 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)

纬度和经度在你的JSON中是小写但是对象的属性有资本L's