Json.NET 不区分大小写的属性反序列化



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);

相关内容

  • 没有找到相关文章

最新更新