2

最近、JSON オブジェクトの 2 つのプロパティが逆シリアル化されないという奇妙な問題に遭遇しました。

このクラスを考えると:

[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 の名前が小文字で、C# プロパティが PascalCase である JSON 文字列を逆シリアル化する他のクラスがありました。

(興味深いことに、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 に答える