Asegurar que las teclas json estén minúsculas en.NET
json.net (4)
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
oNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 y posterior) entrue
.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
deCamelCasePropertyNamesContractResolver
. 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.
¿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.
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);
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();
}
}