Garder le boîtier lors de la sérialisation des dictionnaires
J'ai un projet d'Api Web configuré comme ceci:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Cependant, je tiens les clés de dictionnaire boîtier reste inchangé. est-il un attribut dans Newtonsoft.Json
je peux utiliser pour une classe pour montrer que je veux boîtier à rester inchangée lors de la sérialisation?
public class SomeViewModel
{
public Dictionary<string, string> Data { get; set; }
}
- Avez-vous essayé la résolution par défaut?
- Non, je n'ai pas; pouvez-vous expliquer avec un exemple de la façon dont le code pourrait ressembler? Remarque, j'ai encore envie de Chameau cas de la sérialisation pour tous mes api web demandes, je veux juste de la sérialisation personnalisée pour une classe (ou peut-être pour toutes les clés de dictionnaire).
Vous devez vous connecter pour publier un commentaire.
Il n'est pas un attribut pour ce faire, mais vous pouvez le faire par la personnalisation de l'outil de résolution.
Je vois que vous êtes déjà à l'aide d'un
CamelCasePropertyNamesContractResolver
. Si vous dérivez un nouveau solveur de classe à partir de cela et remplacer leCreateDictionaryContract()
méthode, vous pouvez fournir un substitutDictionaryKeyResolver
fonction qui ne change pas les noms de clé.Voici le code que vous auriez besoin:
Démo:
Voici le résultat de la ci-dessus. Notez que tous les noms de propriété de classe sont en camelcase, mais les clés de dictionnaire ont conservé leur boîte d'origine.
contract.DictionaryKeyResolver = key => key;
fonctionne très bien.DictionaryKeyResolver
que si mon Dictionnaire de la propriété a quelques Attribut personnalisé?Json.NET 9.0.1 introduit la
NamingStrategy
hiérarchie de classes pour gérer ce genre de problème. Il extrait la logique algorithmique de reconfiguration des noms de propriété du contrat de résolution de se séparer, de classe légère qui permet le contrôle de savoir si les clés de dictionnaire, spécifié explicitement les noms de propriété, et les données d'extension de noms de (en 10.0.1) sont reconfigurées.En utilisant
DefaultContractResolver
et réglageNamingStrategy
à une instance deCamelCaseNamingStrategy
vous pouvez générer du JSON avec camelcase les noms de propriété et de non modifiée clés de dictionnaire par la mise enJsonSerializerSettings.ContractResolver
:Notes:
La mise en œuvre actuelle de
CamelCasePropertyNamesContractResolver
précise aussi que .Les membres Net avec spécifiée explicitement les noms de propriété (par exemple celles oùJsonPropertyAttribute.PropertyName
a été définie) doivent avoir leurs noms reconfiguré:Ci-dessus
resolver
conserve ce comportement. Si vous ne voulez pas cela,OverrideSpecifiedNames = false
.Json.NET a intégré plusieurs stratégies de noms, y compris:
CamelCaseNamingStrategy
. Un chameau de cas stratégie de nommage qui contient le nom de reconfiguration de la logique anciennement intégré dansCamelCasePropertyNamesContractResolver
.SnakeCaseNamingStrategy
. Un serpent de cas stratégie de nommage.DefaultNamingStrategy
. Le nom par défaut de la stratégie. Les noms de propriété et les clés de dictionnaire sont inchangés.Ou, vous pouvez créer votre propre en héritant de la classe de base abstraite
NamingStrategy
.Alors qu'il est également possible de modifier le
NamingStrategy
d'une instance deCamelCasePropertyNamesContractResolver
, depuis le dernier actions d'information sur le contrat à l'échelle mondiale à travers toutes les instances de chaque type, cela peut conduire à des effets secondaires inattendus si votre application tente d'utiliser plusieurs instances deCamelCasePropertyNamesContractResolver
. Pas ce problème existe avecDefaultContractResolver
, de sorte qu'il est plus sûr à utiliser lors de la personnalisation du boîtier logique est nécessaire.public Dictionary<string, Dictionary<string, string>> Values { get; set; }
. Il ne fait toujours camelCase pour l'intérieure clés de dictionnaire.CamelCasePropertyNamesContractResolver
. FondamentalementNamingStrategy
pour la première aurait une influence sur les contrats généré par le second. Que à être ce que vous voyez. Essayez la nouvelle recommandation de la place et laissez-moi savoir si résout votre problème.NamingStrategy
, de sorte qu'il est capable d'analyser à la fois camel cas et pascal cas?config
censé être?config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
. Il semble être le MVC 4 Web APIHttpConfiguration
, voir Comment personnaliser JsonSerializerSettings pour Json.NET dans MVC 4 Web API?.C'est une très belle réponse. Mais pourquoi ne pas simplement remplacer le
ResolveDictionaryKey
?La réponse sélectionnée est parfait, mais je suppose que par le temps, je suis en train de taper ceci, le contrat de résolution doit changer pour quelque chose comme cela parce que DictionaryKeyResolver n'existe pas plus 🙂
DictionaryKeyResolver
a été ajouté à version 7.0.1, etPropertyNameResolver
a été marquée comme obsolète.