Json.NET 将"不区分大小写的属性反序列化"列为通告的功能之一。 我已经读到,将首先尝试匹配指定属性的大小写,如果未找到匹配项,则执行不区分大小写的搜索。 但是,这似乎不是默认行为。 请参阅以下示例:
var result =
JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
"{key: 123, value: "test value"}"
);
// result is equal to: default(KeyValuePair<int, string>)
如果更改了 JSON 字符串以匹配属性的大小写("键"和"值"与"键"和"值"),那么一切都很好:
var result =
JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
"{Key: 123, Value: "test value"}"
);
// result is equal to: new KeyValuePair<int, string>(123, "test value")
有没有办法执行不区分大小写的反序列化?
错误。
不区分大小写的属性反序列化是指 Json.NET 能够将名为"密钥"的 JSON 属性映射到 .NET 类的"密钥"或"密钥"成员。
错误是KeyValuePair需要自己的JsonConverter,但错过了不区分大小写的映射。
https://github.com/JamesNK/Newtonsoft.Json/blob/fe200fbaeb5bad3852812db1e964473e1f881d93/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs
以此为基础,在读取 JSON 时将小写的"键"和"值"添加到 case 语句中。
我发现的一种有效方法是将GetValue与StringComparer参数一起使用。
举个例子,
JObject contact;
String strName = contact.GetValue('Name');
您正在尝试访问不区分大小写的"Name"属性,您可以使用
JObject contact;
String strName = contact.GetValue("ObjType", StringComparison.InvariantCultureIgnoreCase);
可以对传入属性名称使用自定义协定解析程序,可以将传入属性更改为与 C# 对象类属性格式匹配的首选格式。我制作了三个自定义合同解析器,它将传入的属性名称更改为标题大小写/小写/大写:
public class TitleCaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
//Change the incoming property name into Title case
var name = string.Concat(propertyName[0].ToString().ToUpper(), propertyName.Substring(1).ToLower());
return base.ResolvePropertyName(name);
}
}
public class LowerCaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
//Change the incoming property name into Lower case
return base.ResolvePropertyName(propertyName.ToLower());
}
}
public class UpperCaseContractResolver : DefaultContractResolver
{
protected override string ResolvePropertyName(string propertyName)
{
//Change the incoming property name into Upper case
return base.ResolvePropertyName(propertyName.ToUpper());
}
}
然后创建一个新的 JsonSerializerSetting 对象,并将自定义协定解析程序放入属性 ContractResolver 中。然后将 JsonSerializerSetting 对象添加到 JsonConvert.DeserializeObject(jsonString, jsonSerializerSetting) 中的第二个参数中
var serializerSetting = new JsonSerializerSettings()
{
ContractResolver = new TitleCaseContractResolver()
};
var result = JsonConvert.DeserializeObject<YourType>(jsonString, serializerSetting);