62 votes

Différence entre @JsonIgnore et @JsonBackReference, @JsonManagedReference

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.

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/

75voto

varren Points 4621

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);

Sérialisation

@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}}

Désérialisation

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.

enter image description here

Mais avec @JsonManagedReference + @JsonBackReference nous obtiendrons Info référence là

enter image description here

3 votes

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.

0 votes

@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.

48voto

Ali Dehghani Points 23885

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.

2 votes

Merci Ali, cela m'a aidé à comprendre la différence réelle entre ignorer, sérialiser et dé-sérialiser. Merci beaucoup

0 votes

@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.com

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.

Powered by:

X