Existe-t-il un moyen simple d'utiliser JSON dans .NET pour s'assurer que les clés sont envoyées en minuscules?
En ce moment, j'utilise la bibliothèque Json.NET de newtonsoft et j'utilise simplement
string loginRequest = JsonConvert.SerializeObject(auth);
Dans ce cas auth
est juste l'objet suivant
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Cela se traduit par
{"Username":"Mark","ApiToken":"xyzABC1234"}
Existe-t-il un moyen de garantir que les touches username
et apitoken
apparaissent en minuscules?
Je ne veux pas simplement l'exécuter, String.ToLower()
bien sûr, car les valeurs de username
et apitoken
sont mixtes.
Je me rends compte que je peux le faire par programme et créer la chaîne JSON manuellement, mais j'en ai besoin pour environ 20 chaînes de données JSON et je vois si je peux gagner du temps. Je me demande s'il existe des bibliothèques déjà construites qui vous permettent d'appliquer des minuscules pour la création de clés.
Réponses:
Vous pouvez créer un résolveur de contrat personnalisé pour cela. Le résolveur de contrat suivant convertira toutes les clés en minuscules:
Usage:
Wil se traduit par:
Si vous souhaitez toujours sérialiser à l'aide de
LowercaseContractResolver
, envisagez de l'encapsuler dans une classe pour éviter de vous répéter:Qui peut être utilisé comme ceci:
ASP.NET MVC4 / WebAPI
Si vous utilisez ASP.NET MVC4 / WebAPI, vous pouvez utiliser une
CamelCasePropertyNamesContractResolver
bibliothèque de Newtonsoft.Json incluse par défaut.la source
CamelCasePropertyNamesContractResolver
. Maintenant, j'ai trouvéSystem.Net.Http.Formatting.JsonContractResolver
la valeur par défaut dans WebAPI et cette classe est interne. Je finis par réécrireJsonContractResolver
avec un étui camel. Quelqu'un a signalé que c'était public aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolver
ne transformez pas les propriétés en minuscules, juste le premier caractère.la source
Dans Json.NET 9.0.1 et versions ultérieures, il est possible de garantir que tous les noms de propriété sont convertis en minuscules à l'aide d'un fichier
NamingStrategy
. Cette classe extrait la logique du remappage algorithmique des noms de propriété du résolveur de contrat vers un objet léger et distinct qui peut être définiDefaultContractResolver.NamingStrategy
. Cela évite d'avoir à créer une coutumeContractResolver
et peut donc être plus facile à intégrer dans des frameworks qui ont déjà leurs propres résolveurs de contrat.Définissez
LowercaseNamingStrategy
comme suit:Puis sérialisez comme suit:
Remarques -
L'utilisation
string.ToLowerInvariant()
garantit que le même contrat est généré dans tous les paramètres régionaux.Pour contrôler si les noms de propriété surchargée, les clés de dictionnaire et les noms de données d'extension sont en minuscules, vous pouvez définir
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
ouNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 et versions ultérieures) àtrue
.Vous souhaiterez peut-être mettre en cache le résolveur de contrat pour de meilleures performances .
Si vous n'avez pas accès aux paramètres du sérialiseur dans votre infrastructure, vous pouvez appliquer un
NamingStrategy
directement à votre objet comme suit:Ne modifiez pas le
NamingStrategy
deCamelCasePropertyNamesContractResolver
. Ce résolveur de contrat partage les informations de type globalement sur toutes ses instances, et ainsi la modification d'une seule instance peut avoir des effets secondaires inattendus.la source
vous pouvez utiliser "JsonProperty":
Usage:
la source
Pour moi, j'ai utilisé une combinaison de certaines des autres réponses et j'ai fini avec ceci
était plus proche d'une solution à ce que je cherchais car je ne cherchais pas à créer la mienne
la source