2012-06-29 165 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);