¿Existe una forma sencilla de usar JSON en .NET para garantizar que las claves se envíen en minúsculas?
En este momento estoy usando la biblioteca Json.NET de newtonsoft y simplemente estoy usando
string loginRequest = JsonConvert.SerializeObject(auth);
En este caso auth
es solo el siguiente objeto
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Esto resulta en
{"Username":"Mark","ApiToken":"xyzABC1234"}
¿Hay alguna forma de garantizar que las teclas username
y apitoken
aparezcan en minúsculas?
No quiero simplemente ejecutarlo, por String.ToLower()
supuesto, porque los valores de username
y apitoken
son mayúsculas y minúsculas.
Me doy cuenta de que puedo hacer esto programáticamente y crear la cadena JSON manualmente, pero necesito esto para aproximadamente 20 cadenas de datos JSON y estoy viendo si puedo ahorrarme algo de tiempo. Me pregunto si hay alguna biblioteca ya construida que le permita aplicar minúsculas para la creación de claves.
Respuestas:
Puede crear un solucionador de contratos personalizado para esto. El siguiente solucionador de contratos convertirá todas las claves a minúsculas:
Uso:
Wil resultado en:
Si siempre desea serializar usando el
LowercaseContractResolver
, considere envolverlo en una clase para evitar repetirse:Que se puede utilizar así:
ASP.NET MVC4 / WebAPI
Si está utilizando ASP.NET MVC4 / WebAPI, puede utilizar una
CamelCasePropertyNamesContractResolver
biblioteca de Newtonsoft.Json que se incluye de forma predeterminada.fuente
CamelCasePropertyNamesContractResolver
. Ahora encontré queSystem.Net.Http.Formatting.JsonContractResolver
es el predeterminado en WebAPI y esta clase es interna. Termino reescribiendoJsonContractResolver
con caja camel. Alguien informó que esto era público aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolver
no transforme las propiedades en minúsculas, solo el primer carácter.fuente
En Json.NET 9.0.1 y versiones posteriores, es posible asegurarse de que todos los nombres de propiedad se conviertan a minúsculas mediante el uso de un archivo
NamingStrategy
. Esta clase extrae la lógica para la reasignación algorítmica de los nombres de propiedad del solucionador de contratos a un objeto ligero separado en el que se puede configurarDefaultContractResolver.NamingStrategy
. Al hacerlo, se evita la necesidad de crear una costumbreContractResolver
y, por lo tanto, puede ser más fácil de integrar en marcos que ya tienen sus propios resolutores de contratos.Defina
LowercaseNamingStrategy
como sigue:Luego serialice de la siguiente manera:
Notas -
El uso
string.ToLowerInvariant()
asegura que se genere el mismo contrato en todas las configuraciones regionales.Para controlar si los nombres de las propiedades reemplazado, claves de un diccionario de datos y los nombres de extensión serán minúsculas, se puede establecer
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
oNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 y posteriores) atrue
.Es posible que desee almacenar en caché el solucionador de contratos para obtener el mejor rendimiento .
Si no tiene acceso a la configuración del serializador en su marco, puede aplicar
NamingStrategy
directamente a su objeto de la siguiente manera:No modifique el
NamingStrategy
deCamelCasePropertyNamesContractResolver
. Este solucionador de contratos comparte información de tipo de forma global en todas sus instancias, por lo que modificar una instancia puede tener efectos secundarios inesperados.fuente
puede utilizar "JsonProperty":
Uso:
fuente
Para mí, utilicé una combinación de algunas de las otras respuestas y terminé con esta
estaba más cerca de una solución a lo que estaba buscando, ya que no estaba buscando crear mi propio
fuente