2012-06-29 7 views
27

Json.NETは、広告された機能の1つとして、「大文字と小文字を区別しないプロパティの逆シリアル化」をリストします。私は、指定されたプロパティの大文字と小文字を一致させる試みが最初に行われ、一致が見つからない場合、大文字と小文字を区別しない検索が実行されることを読んでいます。ただし、これはデフォルトの動作ではありません。 JSON文字列がプロパティ(「キー」と「キー」と「値」対「バリュー」)の場合に一致するように変更された場合は、すべてが順調であるJson.NET大文字と小文字を区別しないプロパティの逆シリアル化

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

// result is equal to: default(KeyValuePair<int, string>) 

:次の例を参照してください

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プロパティを名前 "Key"で.NETクラスの "Key"または "key"メンバーにマップできることを示します。

バグはKeyValuePairが独自のJsonConverterを必要としますが、大文字と小文字を区別しないマッピングが欠落しています。

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

ベースとしてそれを使用してJSONを読み込む際にcase文に小文字の「キー」と「値」を追加します。

+1

感謝を使用して修正することができます。 KeyValuePairにコンバーターが使用されていることは知らなかった。 –

7

私が見つけた1つの効率的な方法は、StringComparerパラメータでGetValueを使用することでした。

したがって、たとえば、あなたは大文字と小文字を区別として「名前」プロパティにアクセスしようとしている

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

、あなたは説明のための

JObject contact; 
String strName = contact.GetValue("ObjType", StringComparison.InvariantCultureIgnoreCase); 
関連する問題