2

我们最近遇到了一个奇怪的问题,即 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这个特定的字符串发生了什么?

4

2 回答 2

3

事实证明,DataContractJsonSerializer如果 JSON 字符串中的所有属性未大写,则它们应按字母顺序排列。将数据更改为

{
  "Address":"123 Maple Avenue",
  "latitude":45.421530,
  "longitude":-75.697193
  "Name":"My Awesome Hotel",
  "Phone":"+15550001212",
  "PostalCode":"",
  "Province":"ON",
}

使对象完美地反序列化。

(如预期的那样,以相同的顺序保留属性并将“L”大写也有效)

于 2013-08-12T15:27:55.667 回答
2

latitute 和 longitude 在您的 JSON 中是小写的,但对象的属性具有大写 L

于 2013-08-12T15:29:47.813 回答