json.net

Deserialización de propiedades insensibles a mayúsculas/minúsculas Json.NET



(2)

Json.NET enumera la "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. Vea el siguiente ejemplo:

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" frente a "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?


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 se pierde el mapeo insensible a mayúsculas y minúsculas.

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

Úselo como base y agregue la "clave" y el "valor" en minúscula a la declaración de caso al leer JSON.


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

Así por ejemplo,

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

Está intentando acceder a la propiedad ''Nombre'' como no distingue entre mayúsculas y minúsculas, puede usar

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