¿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 authes 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 usernamey apitokenaparezcan en minúsculas?
No quiero simplemente ejecutarlo, por String.ToLower()supuesto, porque los valores de usernamey apitokenson 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
CamelCasePropertyNamesContractResolverbiblioteca de Newtonsoft.Json que se incluye de forma predeterminada.fuente
CamelCasePropertyNamesContractResolver. Ahora encontré queSystem.Net.Http.Formatting.JsonContractResolveres el predeterminado en WebAPI y esta clase es interna. Termino reescribiendoJsonContractResolvercon caja camel. Alguien informó que esto era público aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolverno 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 costumbreContractResolvery, por lo tanto, puede ser más fácil de integrar en marcos que ya tienen sus propios resolutores de contratos.Defina
LowercaseNamingStrategycomo 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.ProcessDictionaryKeysoNamingStrategy.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
NamingStrategydirectamente a su objeto de la siguiente manera:No modifique el
NamingStrategydeCamelCasePropertyNamesContractResolver. 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