Asegurar que las teclas json estén minúsculas en .NET

¿Hay alguna forma sencilla de utilizar 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 claves de username y apitoken en minúscula?

No quiero simplemente ejecutarlo a través de String.ToLower() por supuesto, porque los valores de username de username y apitoken son casos mixtos.

Me doy cuenta de que puedo hacer esto programáticamente y crear la cadena JSON manualmente, pero lo necesito para aproximadamente 20 cadenas de datos JSON y estoy viendo si puedo ahorrar algo de tiempo. Me pregunto si ya hay bibliotecas creadas que te permitan aplicar minúsculas para la creación de claves.

Puede crear una resolución de contrato personalizada para esto. La siguiente resolución de contrato convertirá todas las claves a minúsculas:

 public class LowercaseContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.ToLower(); } } 

Uso:

 var settings = new JsonSerializerSettings(); settings.ContractResolver = new LowercaseContractResolver(); var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings); 

Resultado Wil en:

 {"username":"Mark","apitoken":"xyzABC1234"} 

Si siempre deseas serializar usando LowercaseContractResolver , considera envolverlo en una clase para evitar que te repitas:

 public class LowercaseJsonSerializer { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new LowercaseContractResolver() }; public static string SerializeObject(object o) { return JsonConvert.SerializeObject(o, Formatting.Indented, Settings); } public class LowercaseContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.ToLower(); } } } 

Que se puede usar así:

 var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" }); // { "foo": "bar" } 

ASP.NET MVC4 / WebAPI

Si está utilizando ASP.NET MVC4 / WebAPI, puede usar un CamelCasePropertyNamesContractResolver de la biblioteca Newtonsoft.Json que se incluye por defecto.

 protected void Application_Start() { JsonConfig.Configure(); } public static class JsonConfig { public static void Configure(){ var formatters = GlobalConfiguration.Configuration.Formatters; var jsonFormatter = formatters.JsonFormatter; var settings = jsonFormatter.SerializerSettings; settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); } } 

En Json.NET 9.0.1 y posterior, es posible garantizar que todos los nombres de propiedad se conviertan en minúsculas mediante el uso de una NamingStrategy personalizada. Esta clase extrae la lógica para la reasignación algorítmica de los nombres de propiedades del resuelve de contratos a un objeto separado y liviano que se puede establecer en DefaultContractResolver.NamingStrategy . Al hacerlo, evita la necesidad de crear un ContractResolver personalizado y, por lo tanto, puede ser más fácil de integrar en marcos que ya tienen sus propios resúmenes de contratos.

Defina LowercaseNamingStrategy siguiente manera:

 public class LowercaseNamingStrategy : NamingStrategy { protected override string ResolvePropertyName(string name) { return name.ToLowerInvariant(); } } 

A continuación, serialice de la siguiente manera:

 var settings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() }, }; string loginRequest = JsonConvert.SerializeObject(auth, settings); 

Notas –

  • El uso de string.ToLowerInvariant() garantiza que se genere el mismo contrato en todas las configuraciones regionales.

  • Para controlar si los nombres de propiedad anulados, las claves del diccionario y los nombres de datos de extensión están en minúscula, puede establecer NamingStrategy.OverrideSpecifiedNames , NamingStrategy.ProcessDictionaryKeys o NamingStrategy.ProcessExtensionDataNames (Json.NET 10.0.1 y posterior) en true .

  • Es posible que desee almacenar en caché el resolver del contrato para obtener el mejor rendimiento .

  • Si no tiene acceso a la configuración del serializador en su marco, puede aplicar una NamingStrategy directamente a su objeto de la siguiente manera:

     [JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))] public class Authority { public string Username { get; set; } public string ApiToken { get; set; } } 
  • No modifique la NamingStrategy de CamelCasePropertyNamesContractResolver . Este sistema de resolución de contratos comparte información de tipo globalmente en todas sus instancias, por lo que modificar cualquier instancia puede tener efectos secundarios inesperados.

puedes usar “JsonProperty”:

Uso:

 public class Authority { [JsonProperty("userName")] // or [JsonProperty("username")] public string Username { get; set; } [JsonProperty("apiToken")] // or [JsonProperty("apitoken")] public string ApiToken { get; set; } } var json = JsonConvert.SerializeObject(authority);