2012-06-29 22 views
27

Json.NET listet "Case-insensitive Eigenschaft Deserialisierung" als eine der angekündigten Funktionen. Ich habe gelesen, dass zuerst versucht wird, den Fall der angegebenen Eigenschaft zu vergleichen, und wenn eine Übereinstimmung nicht gefunden wird, wird eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchgeführt. Dies scheint jedoch nicht das Standardverhalten zu sein. Siehe das folgende Beispiel:Json.NET Groß-und Kleinschreibung keine Eigenschaft Deserialisierung

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

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

Wenn die JSON-String geändert wird, um den Fall der Eigenschaften übereinstimmen („Key“ und „Value“ vs „Schlüssel“ und „Wert“), dann ist alles gut:

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

// result is equal to: new KeyValuePair<int, string>(123, "test value") 

Gibt es eine Möglichkeit, die Groß- und Kleinschreibung der Deserialisierung durchzuführen?

Antwort

23

Das ist ein Fehler.

Bei der Deserialisierung der Groß- und Kleinschreibung wird darauf hingewiesen, dass Json.NET in der Lage ist, eine JSON-Eigenschaft mit dem Namen "Key" entweder dem Schlüssel- oder Schlüsselelement der .NET-Klasse zuzuordnen.

Der Fehler ist KeyValuePair erfordert einen eigenen JsonConverter aber fehlt aus der case insensitive Mapping.

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

verwenden, die als eine Basis und fügen die unteren Gehäuse „Schlüssel“ und „Wert“ auf den Fall, wenn JSON Anweisung zu lesen.

+1

Danke für die Erklärung und beheben verwenden. Mir war nicht bewusst, dass ein Converter für KeyValuePair verwendet wurde. –

7

Ein effizienter Weg, den ich fand, war GetValue mit StringComparer Parameter zu verwenden.

So zum Beispiel,

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

Sie versuchen, 'Name' Eigenschaft als Fall für den Zugriff unempfindlich, können Sie

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