Garantire che le chiavi JSON siano in minuscolo in .NET

C’è un modo semplice con JSON in .NET per garantire che le chiavi vengano inviate in minuscolo?

Al momento sto usando la libreria Json.NET di newtonsoft e sto semplicemente usando

string loginRequest = JsonConvert.SerializeObject(auth); 

In questo caso auth è solo il seguente object

 public class Authority { public string Username { get; set; } public string ApiToken { get; set; } } 

Questo risulta in

 {"Username":"Mark","ApiToken":"xyzABC1234"} 

C’è un modo per garantire che il username e apitoken chiavi apitoken vengano visualizzati in minuscolo?

Non voglio semplicemente eseguirlo tramite String.ToLower() ovviamente perché i valori per username e apitoken sono case miste.

Mi rendo conto che posso farlo in modo programmatico e creare manualmente la stringa JSON, ma ho bisogno di questo per circa 20 stringhe di dati JSON e sto vedendo se riesco a salvarmi un po ‘di tempo. Mi chiedo se ci sono librerie già costruite che ti permettono di imporre minuscole per la creazione di chiavi.

Puoi creare un risolutore di contratto personalizzato per questo. Il seguente resolver di contratto convertirà tutte le chiavi in ​​lettere minuscole:

 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); 

Wil si traduce in:

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

Se vuoi sempre serializzare usando LowercaseContractResolver , considera di includerlo in una class per evitare di ripetere te stesso:

 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(); } } } 

Quale può essere usato in questo modo:

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

ASP.NET MVC4 / WebAPI

Se si utilizza ASP.NET MVC4 / WebAPI, è ansible utilizzare CamelCasePropertyNamesContractResolver dalla libreria Newtonsoft.Json inclusa per impostazione predefinita.

 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(); } } 

In JSON.NET 9.0.1 e versioni successive è ansible garantire che tutti i nomi di proprietà vengano convertiti in caratteri minuscoli utilizzando una NamingStrategy personalizzata. Questa class estrae la logica per la rimapping algoritmica dei nomi di proprietà dal resolver del contratto a un object leggero separato che può essere impostato su DefaultContractResolver.NamingStrategy . Ciò evita la necessità di creare un ContractResolver personalizzato e quindi può essere più facile da integrare in framework che hanno già i propri risolutori di contratto.

Definisci LowercaseNamingStrategy come segue:

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

Quindi serializzare come segue:

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

Gli appunti –

  • L’utilizzo di string.ToLowerInvariant() garantisce che lo stesso contratto venga generato in tutte le string.ToLowerInvariant() locali.

  • Per controllare se i nomi delle proprietà NamingStrategy.OverrideSpecifiedNames override, le chiavi del dizionario e i nomi dei dati di estensione sono in minuscolo, è ansible impostare NamingStrategy.OverrideSpecifiedNames , NamingStrategy.ProcessDictionaryKeys o NamingStrategy.ProcessExtensionDataNames (Json.NET 10.0.1 e versioni successive) su true .

  • Si consiglia di memorizzare nella cache il risolutore del contratto per ottenere prestazioni ottimali .

  • Se non hai accesso alle impostazioni del serializzatore nel tuo framework, puoi applicare un NamingStrategy direttamente al tuo object come segue:

     [JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))] public class Authority { public string Username { get; set; } public string ApiToken { get; set; } } 
  • Non modificare NamingStrategy di CamelCasePropertyNamesContractResolver . Questo risolutore di contratto condivide le informazioni sul tipo a livello globale in tutte le sue istanze e pertanto la modifica di qualsiasi istanza può avere effetti collaterali imprevisti.

puoi usare “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);