Comment résoudre référence circulaire en json sérialiseur causés par hibernate mise en correspondance bidirectionnelle?
Je suis en train d'écrire un sérialiseur pour sérialiser des POJO en JSON mais coincé dans la circulaire de référence de problème. Dans hibernate bidirectionnel un-à-plusieurs relation parent références de l'enfant et de l'enfant références de parent et voici mon sérialiseur meurt. (voir l'exemple de code ci-dessous)
Comment sortir de ce cycle? Pouvons-nous obtenir le propriétaire de l'arbre d'un objet pour voir si l'objet lui-même existe, quelque part dans son propre propriétaire de la hiérarchie? Tout autre moyen de trouver de si la référence va être circulaire? ou toute autre idée pour résoudre ce problème?
- Vouliez-vous dire à coller le code dans certains pour nous de vous aider à résoudre votre problème?
- eugène de l'annotation en fonction de la solution est ok, mais il n'est pas nécessaire pour plus d'annotation et ExclusionStrategy mise en œuvre dans ce cas. Suffit d'utiliser Java 'transientce mot-clé pour que. Il travaille pour Java standard de sérialisation d'un objet, mais aussi Gson égards.
Vous devez vous connecter pour publier un commentaire.
Peut entretenir une relation bidirectionnelle même être représenté en JSON? Certains formats de données ne sont pas bons ajustements pour certains types de modélisation des données.
Une méthode pour traiter les cycles lorsque vous traitez avec de la traversée de graphes d'objets est de suivre les objets que vous avez vu jusqu'à présent (en utilisant l'identité des comparaisons), pour vous empêcher de traverser vers le bas d'un cycle infini.
Je compte sur Google JSON À gérer ce genre de problème en utilisant La fonction
Supposons qu'un bi-directionnelle de la relation entre A et B classe comme suit
Et B
Maintenant utiliser GsonBuilder Pour obtenir une mesure Gson objet comme suit (Notez setExclusionStrategies méthode)
Maintenant notre référence circulaire
Prendre un coup d'oeil à GsonBuilder classe
Jackson 1.6 (publié en septembre 2010) est spécifique d'annotation de base de soutien pour le traitement de telles parent/enfant de liaison, voir http://wiki.fasterxml.com/JacksonFeatureBiDirReferences. (Wayback Instantané)
Vous pouvez bien sûr déjà exclure la sérialisation de lien parent déjà à l'aide de la plupart JSON de traitement de paquets (jackson, gson et flex-json au moins la soutenir), mais le vrai truc, c'est comment le désérialiser retour (re-créer du lien parent), et pas seulement gérer la sérialisation côté. Bien que les sons comme pour l'instant, l'exclusion peut travailler pour vous.
ÉDITION (avril 2012): Jackson 2.0 prend désormais en charge la vraie références identitaires (Wayback Instantané), de sorte que vous pouvez le résoudre de cette façon aussi.
Dans la résolution de ce problème, j'ai pris l'approche suivante (la standardisation du processus au sein de mon application, ce qui rend le code clair et réutilisable):
Voici le code:
1)
2)
3)
4)
5)
Dans le premier cas, la valeur null est fourni au constructeur, vous pouvez spécifier une autre classe d'être exclu - les deux options sont ajoutées ci-dessous
6)
ou, pour exclure de l'objet Date
Si vous utilisez Jackon à sérialiser, il suffit d'appliquer @JsonBackReference à votre bi-directinal cartographie
Il permettra de résoudre la référence circulaire problème.
Note : @JsonBackReference est utilisée pour résoudre la récursivité Infinie (StackOverflowError)
@JsonIgnore
fait monJpaRepository
ne parviennent pas à mapper la propriété mais@JsonBackReference
résolu le problème de la référence circulaire, et encore de bonnes conditions de cartographie pour la problématique de l'attributUtilisé une solution similaire à Arthur, mais au lieu de
setExclusionStrategies
j'ai utiliséet utilisé
@Expose
gson annotation pour les champs dont j'ai besoin dans le json, mais d'autres domaines sont exclus.Si vous êtes à l'aide de Javascript, il y a une solution très simple pour que l'utilisation de la
replacer
paramètre deJSON.stringify()
méthode où vous pouvez passer d'une fonction à modifier la sérialisation par défaut de comportement.Voici comment vous pouvez l'utiliser. Considérons l'exemple ci-dessous avec 4 nœuds dans un graphe cyclique.
Plus tard, vous pouvez facilement recréer l'objet réel avec le cyclique références de l'analyse des données sérialisées et la modification de la
next
de la propriété au point de l'objet réel si c'est à l'aide d'un nommé de référence avec un@
comme dans cet exemple.C'est comment j'ai finalement résolu dans mon cas. Cela fonctionne au moins avec Gson & Jackson.
Cette erreur peut appened lorsque vous avez deux objets :
Avec l'aide de GSon pour la sérialisation, j'ai eu cette erreur :
Pour résoudre cela, il suffit de rajouter le mot clé transient :
Comme vous pouvez le voir ici : Pourquoi Java ont transitoire champs?
Jackson donne
JsonIdentityInfo
annotation pour éviter les références circulaires. Vous pouvez consulter le tutoriel ici.la réponse à la question 8 est le mieux, je pense donc, si vous savez ce champ est en train de jeter une erreur de le vous seulement de régler le fild dans nulle et résolu.
Pour rendre le code lisible par un grand commentaire est déplacé à partir du commentaire
//**
ci-dessous.Par exemple, ProductBean a serialBean. La cartographie être bi-directionnelle de la relation. Si nous essayons maintenant d'utiliser
gson.toJson()
, il va se retrouver avec une référence circulaire. Pour éviter ce problème, vous pouvez suivre ces étapes:productBean.serialBean.productBean = null;
gson.toJson();
Qui devrait résoudre le problème