2012-06-29 161 views
27

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

有没有一种方法来执行不区分大小写的反序列化?

回答

23

这是一个错误。

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

该错误是KeyValuePair需要它自己的JsonConverter,但忽略了不区分大小写的映射。

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

使用JSON读取时为基础,并添加了小写的“关键”和“价值”的情况说明。

+1

感谢您的解释和解决。我不知道一个Converter用于KeyValuePair。 –

7

我发现的一种有效方法是使用带有StringComparer参数的GetValue。

因此,例如,

JObject contact; 
String strName = contact.GetValue('Name'); 

您试图访问“名称”属性不区分大小写,您可以使用

JObject contact; 
String strName = contact.GetValue("ObjType", StringComparison.InvariantCultureIgnoreCase);