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

Phi*_*ein 32 c# json.net

Json.NET将"不区分大小写的属性反序列化"列为广告功能之一.我已经读过,将首先尝试匹配指定属性的大小写,如果未找到匹配项,则执行不区分大小写的搜索.但是,这似乎不是默认行为.请参阅以下示例:

var result =
    JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
        "{key: 123, value: \"test value\"}"
    );

// result is equal to: default(KeyValuePair<int, string>)
Run Code Online (Sandbox Code Playgroud)

如果更改了JSON字符串以匹配属性的情况("Key"和"Value"vs"key"和"value"),那么一切都很好:

var result =
    JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
        "{Key: 123, Value: \"test value\"}"
    );

// result is equal to: new KeyValuePair<int, string>(123, "test value")
Run Code Online (Sandbox Code Playgroud)

有没有办法执行不区分大小写的反序列化?

Jam*_*ing 27

那是一个错误.

不区分大小写的属性反序列化是指Json.NET能够将名为"Key"的JSON属性映射到.NET类的"Key"或"key"成员.

错误是KeyValuePair需要自己的JsonConverter但是错过了不区分大小写的映射.

https://github.com/JamesNK/Newtonsoft.Json/blob/fe200fbaeb5bad3852812db1e964473e1f881d93/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs

使用它作为基础,并在读取JSON时将小写"key"和"value"添加到case语句.


小智 9

我发现的一种有效方法是将GetValue与StringComparer参数一起使用.

所以,例如,

JObject contact;
String strName = contact.GetValue('Name');
Run Code Online (Sandbox Code Playgroud)

您正在尝试访问"名称"属性,因为不区分大小写,您可以使用

JObject contact;
String strName = contact.GetValue("ObjType", StringComparison.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)