最近、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
では、この特定の文字列で何が起こっていたのでしょうか?