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

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

最佳答案

事实证明,DataContractJsonSerializer 期望 JSON 字符串中的所有属性按字母顺序排列(如果它们不是大写)。将数据更改为

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

使对象完美反序列化。

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

关于c# - 为什么 DataContractJsonSerializer 会跳过某些属性的反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190886/

相关文章:

.net - 查看 .NET 应用程序中所有调用的最简单方法(分析/检测)

jquery - jqGrid 的 Coldfusion + JSON 问题

json - 如何向每个 header 添加 json 网络 token ?

c# - Droplist 有一个无效的 SelectedValue,因为它不存在于项目列表中

.NET SOAP 客户端使用 :Array

c# - 为什么不允许条件属性方法返回 void 以外的值

C# linq to json 如何读取数组中的属性值

c# - 如何使用 WebBrowser 获取新窗口的 URL

c# - Asp.net Web 应用程序基于角色的身份验证

c# - dotnet.exe 与 w3wp.exe : what's difference?