La sérialisation des entités JPA JSON à l'aide de Jackson
Question concernant la combinaison de Jackson/JPA
- Si, il ya environ 20 entités dans l'application actuelle et j'ai ajouter Jackson dépendance dans le POM, ça veut dire que toutes les entités sont, par défaut, prêt à se convertir à
JSON
objet? J'ai vu un exemple de projet semble que la classe annotée comme@JsonIgnored
est ignorée parJSON
. Si oui, alors comment peut-il se passer, ce qui est à l'origine d'un tel mécanisme? commentJACKSON
gérer ces entités qui n'ont pas de Jackson annotation, par défaut ignoré ou pas? J'ai été à la recherche de ressources en ligne, mais pas beaucoup de chance. - Si un seul des 20 entités doivent être mappés pour objet JSON, ça veut dire que j'ai à ajouter @JsonIgnore à tous les 19 autres entités? Si non, comment
Jackson
la différence avec une entité?
Grâce.
Est ce que les "entités" signifie dans votre contexte? Est-il en classe? Des champs d'une classe? Méthodes? Ne peut pas vous aider si vous êtes à la vague...
C'est une classe, comme entité JPA.
C'est une classe, comme entité JPA.
OriginalL'auteur Dreamer | 2013-04-12
Vous devez vous connecter pour publier un commentaire.
Jackson et JPA n'ont rien à voir les uns avec les autres. Jackson est un JSON l'analyse de la bibliothèque et de la JPA est une infrastructure de persistance. Jackson peut sérialiser presque tout objet - à la seule condition que l'objet ont une sorte de reconnaissable propriétés (Propriétés de type Javabean, ou les champs annotés avec
@JsonProperty
. Il y a une exigence supplémentaire pour désérialisation, que le type de cible ont une valeur par défaut (sans argument) constructeur. Ainsi, par exemple, c'est un objet que Jackson peut sérialiser:Et voici un autre:
Et voici encore une autre:
Le dernier exemple montre une entité JPA - aussi loin que Jackson est concerné, il peut être sérialisé, tout comme n'importe quel autre type. Mais, de prendre note de ses champs: lorsque cet objet est sérialisé en JSON deux champs ne seront pas inclus - "mot de passe" et "adresse". C'est parce qu'ils ont été annotés avec
@JsonIgnore
. Le@JsonIgnore
annotation permet à un développeur de dire "Hey, c'est ok pour sérialiser cet objet, mais quand vous le faites de ne pas inclure ces champs de la sortie". Cette exclusion se produit uniquement pour les champs de cet objet, par exemple, si vous avez inclus uneAddress
champ dans une autre classe, mais n'a pas marqué le champ comme ignorable, il serait sérialisé.Pour empêcher la sérialisation d'un type dans tous les cas, quel que soit le contexte, l'utilisation de la
@JsonIgnoreType
annotation. Lorsqu'il est utilisé sur un type qu'il signifie 'je n'ai pas de soins, où ce type est utilisé, jamais sérialiser".JACKSON
auto convertir toutes les entités JPA pourJSON
objet par défaut, même sans explicitement déclaration(Si ce n'est l'utilisation@JsonIgnore
et@JsonIgnoreType
)? Si oui, est ce genre de redundency? Je sais que toutes les entités JPA sont tousserializable
même sansJACKSON
, mais est-ce dire qu'il n'y a pas de frais supplémentaires pour convertir toutes les entités àJSON
objet?Jackson ne rien faire jusqu'à ce que vous appelez la sérialisation, par exemple en appelant
new ObjectMapper().writeValueToString(new Person();
. Dans ce cas, unPerson
objet serait écrit comme JSON, ainsi que des objets qu'il désigne (comme variables de classe). Comme il l'écrit de ces objets JSON, il ignore les champs annotés avec@JsonIgnore
, ou types annotés avec@JsonIgnoreType
. Ce sont les règles. À aucun moment n'Jackson dire " oh, il y a 50 classes de ce package, vous permet de les convertir en JSON pour le fun`. L'espoir qui efface les choses certaines.si JACKSON ne sera pas de les convertir en une seule fois mais pour une Entité dire ClassNoJSON quand (par exemple) devient géré ensuite le ObjectMapper commencer à travailler? En un mot, le développeur doit être prudent et supposé mettre
@JsonIgnoreType
ou@JsonIgnore
inutiles entités ou des champs de meilleures performances? Je viens d'essayer de comprendre, que je suis ajoutant JSON fonction de l'entité, mais pas à un coût supplémentaire des coûts sur toutes les entités.yep c'est assez bien correct. Jackson ne pas prétraiter les classes en aucune manière, l'ajout ou l'omission de Jackson d'annotation à partir d'une classe ne contrôle ce qui se produit lors de l'exécution. À l'aide de
@JsonIgnore
et@JsonIgnoreType
peut réduire le nombre total de champs/types qui doivent être sérialisé pour un certain appel, ce qui conduira à l'amélioration de la performance (mémoire et de la vitesse) dans beaucoup de cas.Excellentes réponses, des grandes solutions. Merci beaucoup.
OriginalL'auteur Perception
Non, vous n'avez pas besoin d'ajouter
@JsonIgnore
sur chaque classe, et si vous aviez essayé de vous aurait eu une erreur de compilation, puisque vous ne pouvez pas le mettre là. Jackson ne fonctionne que sur les objets que vous donnez, c'est pas de la magie.La Jackson la documentation est facilement disponibles en ligne, notamment sur sa page de projet sur github ou sur le codehaus site web.
Jackson will only work on objects you give to it, it's no magic.
Commentgive it
pourriez-vous être plus précis? Merci pour le lien mais je n'ai pas trouvé beaucoup sur JPA/Jackson surJACKSON DOCUMENTATION
Hmmmmm, quelle est votre question, alors? Comment configurer JPA (hibernate?) pour utiliser Jackson pour faire de la sérialisation?
Oui, la question est plus comme la façon de configurer
Jackson
sur JPA, mais ma confusion est vraiment sur la façonJACKSON
gérer ces entités qui n'ont pas de Jackson annotation, par défaut ignoré ou pas?OriginalL'auteur Pascal Gélinas