2012-06-29 33 views
27

Json.NET enumera "Deserialización de propiedades insensible a las mayúsculas y minúsculas" como una de las características anunciadas. He leído que primero se intentará hacer coincidir el caso de la propiedad especificada y, si no se encuentra una coincidencia, se realiza una búsqueda que no distingue entre mayúsculas y minúsculas. Sin embargo, este no parece ser el comportamiento predeterminado. Véase el siguiente ejemplo:Deserialización de propiedades insensible a las mayúsculas y minúsculas Json.NET

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

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

Si la cadena JSON se altera para que coincida con el caso de las propiedades ("clave" y "Valor" vs "clave" y "valor") entonces todo está bien:

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

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

¿Hay alguna forma de realizar una deserialización insensible a mayúsculas y minúsculas?

Respuesta

23

Eso es un error.

La deserialización de propiedad insensible a las mayúsculas y minúsculas se refiere a que Json.NET puede asignar una propiedad JSON con el nombre "Clave" a un miembro "Clave" o "clave" de la clase .NET.

El error es KeyValuePair requiere su propio JsonConverter, pero pierde la asignación de mayúsculas y minúsculas insensible.

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

usar eso como una base y añadir el caso "clave" inferior y "valor" a la declaración de caso al leer JSON.

+1

Gracias por la explicación y corregir. No sabía que se usó un convertidor para KeyValuePair. –

7

Una forma eficiente que encontré fue usar GetValue con el parámetro StringComparer.

Así, por ejemplo,

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

Usted está tratando de acceder a la propiedad 'Nombre' como entre mayúsculas y minúsculas, puede utilizar

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