gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:54:48 25 4
gpt4 key购买 nike

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

最佳答案

事实证明,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/

25 4 0
文章推荐: sas - 根据现有的 id 变量创建唯一的 id 变量
文章推荐: c# - Asp.NET 返回空 List C#