JSON.net ContractResolver vs. JsonConverter

j'ai travaillé avec JSON.net pendant un moment. J'ai écrit à la fois des convertisseurs personnalisés et des résolveurs de contrat Personnalisés (généralement à partir de modifier des exemples sur S. O. et le site Web Newtonsoft), et ils fonctionnent très bien.

le défi est, à part des exemples, je vois peu d'explications quant au moment où je devrais utiliser l'un ou l'autre (ou les deux) pour le traitement. Par ma propre expérience, j'ai déterminé que les résolveurs de contrat sont plus simples, donc si je peux faire ce dont j'ai besoin avec eux, je vais par là; autrement, j'utilise des Jsonconverteurs personnalisés. Mais, je sais aussi que les deux sont parfois utilisés ensemble, de sorte que les concepts deviennent encore plus opaques.

Questions:

  1. y a-t-il une source qui distingue quand utiliser l'un par rapport à l'autre? Je trouve que la documentation de Newtonsoft n'est pas claire quant à la façon dont les deux sont différenciés ou quand utiliser l'un ou l'autre.
  2. Quel est le pipeline de commande entre les deux?
36
demandé sur Brian Rogers 2016-12-11 19:40:32
la source

1 ответов

grande question. Je n'ai pas vu une pièce de documentation claire qui dit quand vous devriez préférer écrire une coutume ContractResolver ou une coutume JsonConverter pour résoudre un type particulier de problème. Ils font vraiment des choses différentes, mais il y a un certain chevauchement entre les types de problèmes qui peuvent être résolus par chacun. J'ai écrit un bon nombre de chacun tout en répondant aux questions sur StackOverflow, de sorte que l'image est devenue un peu plus clair pour moi au fil du temps. Ci-dessous est mon prendre sur elle.

ContractResolver

un résolveur de contrat est toujours utilisé par Json.Net, et régit le comportement de sérialisation / désérialisation à un niveau général. S'il n'y a pas de résolveur personnalisé dans les paramètres, alors le DefaultContractResolver est utilisé. Le solveur est chargé de déterminer:

  • ce contrat chaque type A (i.e. est-il une primitive, tableau/liste, dictionnaire, dynamique, JObject , objet simple et ancien, etc.);
  • quelles sont les propriétés sur le type (le cas échéant) et quels sont leurs noms, types et accessibilité;
  • ce attributs ont été appliqués (p. ex. [JsonProperty] , [JsonIgnore] , [JsonConverter] , etc.), et
  • comment ces attributs affecter la (de)sérialisation de chaque propriété (ou classe).

en général, si vous voulez personnaliser un aspect de la sérialisation ou de la desérialisation à travers un large éventail de classes, vous aurez probablement besoin d'utiliser un ContractResolver pour le faire. Voici quelques exemples de choses que vous pouvez personnaliser en utilisant un ContractResolver :

JsonConverter

contrairement à un ContractResolver , le point de mire d'un JsonConverter est plus étroit: il est vraiment destiné à gérer la sérialisation ou la desérialisation pour un seul type ou un petit sous-ensemble de types apparentés. Aussi, il fonctionne à un niveau inférieur à celui d'un résolveur. Lorsqu'un convertisseur est chargé de la responsabilité d'un type, il a le contrôle total sur la façon dont le JSON est lu ou écrit pour ce type: il utilise directement les classes JsonReader et JsonWriter pour faire son travail. En d'autres termes, il peut changer la forme du JSON pour ce type. En même temps, un convertisseur est découplé de la "vue d'ensemble" et n'a pas accès à informations contextuelles telles que le parent de l'objet (de)sérialisés ou la propriété des attributs qui ont été utilisés. Voici quelques exemples de problèmes que vous pouvez résoudre avec un JsonConverter :

102
répondu Brian Rogers 2017-05-23 13:31:23
la source

Autres questions sur json.net