Je connais les deux @JsonIgnore
et @JsonManagedReference
, @JsonBackReference
sont utilisés pour résoudre le Infinite recursion (StackOverflowError)
Quelle est la différence entre les deux ?
Note : Ce sont les annotations de Jackson.
Je connais les deux @JsonIgnore
et @JsonManagedReference
, @JsonBackReference
sont utilisés pour résoudre le Infinite recursion (StackOverflowError)
Quelle est la différence entre les deux ?
Note : Ce sont les annotations de Jackson.
Supposons que nous ayons
private class Player {
public int id;
public Info info;
}
private class Info {
public int id;
public Player parentPlayer;
}
// something like this:
Player player = new Player(1);
player.info = new Info(1, player);
@JsonIgnore
private class Info {
public int id;
@JsonIgnore
public Player parentPlayer;
}
et @JsonManagedReference
+ @JsonBackReference
private class Player {
public int id;
@JsonManagedReference
public Info info;
}
private class Info {
public int id;
@JsonBackReference
public Player parentPlayer;
}
produira le même résultat. Et sortie pour le cas de démonstration ci-dessus est : {"id":1,"info":{"id":1}}
Voici la principale différence, car la désérialisation avec @JsonIgnore
mettra simplement null dans le champ, donc dans notre exemple, parentPlayer sera == null.
Mais avec @JsonManagedReference
+ @JsonBackReference
nous obtiendrons Info
référence là
Merci beaucoup, cela a clarifié beaucoup de doutes dans mon esprit. J'essayais de rechercher ce type particulier de sérialisation qui ne cassera pas ou n'ignorera pas l'un ou l'autre côté de la sérialisation.
@varren J'ai une question similaire ici où je dois analyser un champ récursif et il semble que je doive utiliser @JsonManagedReference
mais je ne suis pas sûr de savoir comment ça va fonctionner ? J'ai essayé d'utiliser JsonManagedReference
et JsonBackReference
mais cela ne semble pas fonctionner et j'obtiens à chaque fois une exception. Je voulais donc voir si vous pouviez m'aider.
sont utilisés pour résoudre la récursion infinie (StackOverflowError)
@JsonIgnore
n'est pas conçu pour résoudre le Récursion infinie il ignore simplement la propriété annotée pour la sérialiser ou la désérialiser. Mais s'il y avait un lien bidirectionnel entre les champs, puisque @JsonIgnore
ignore la propriété annotée, vous pouvez éviter la récursion infinie.
D'un autre côté, @JsonManagedReference
et @JsonBackReference
sont conçus pour gérer cette liaison bidirectionnelle entre les champs, l'un pour les Parent l'autre pour le rôle de Enfant respectivement :
Pour éviter ce problème, la liaison est traitée de telle sorte que la propriété annotée avec
@JsonManagedReference
est traitée normalement (sérialisée normalement, pas de traitement spécial pour la désérialisation) et la propriété annotée avec@JsonBackReference
n'est pas sérialisée ; et lors de la désérialisation, sa valeur est fixée à l'instance qui a le lien "managed" (vers l'avant).
Pour récapituler, si vous n'avez pas besoin de ces propriétés dans le processus de sérialisation ou de désérialisation, vous pouvez utiliser @JsonIgnore
. Sinon, en utilisant le @JsonManagedReference
/ @JsonBackReference
La paire est la meilleure solution.
Merci Ali, cela m'a aidé à comprendre la différence réelle entre ignorer, sérialiser et dé-sérialiser. Merci beaucoup
@AliDehghani J'ai une question similaire. ici où je dois analyser un champ récursif et il semble que je doive utiliser @JsonManagedReference
mais je ne suis pas sûr de savoir comment ça va fonctionner ? J'ai essayé d'utiliser JsonManagedReference
et JsonBackReference
mais cela ne semble pas fonctionner et j'obtiens à chaque fois une exception. Je voulais donc voir si vous pouviez m'aider.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Oui, j'ai essayé les documents et les ai mis en œuvre dans le projet, mais j'étais seulement confus avec la technique qu'ils utilisent dans le processus de conversion. Comme les deux ont produit le même résultat, je ne savais pas où donner la préférence à l'un plutôt qu'à l'autre.
2 votes
Trois approches pour résoudre la dépendance récursive de JSON : springquay.blogspot.com/2016/01/