Comment Utiliser Jackson @JsonIdentityInfo pour la Désérialisation des Graphes orientés?
Je veux utiliser Jackson 2.3.3 pour la Sérialisation/désérialisation des graphes orientés. La structure que j'ai trouvé est à peu près le suivant:
public Class Graph {
private final Set<Node> nodes;
public Graph(Set<Node> nodes) { ... }
public Set<Node> getNodes() { ... }
}
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "name")
public Class Node {
private final String name;
private final Set<Edge> edges;
public Node(String name, Set<Edge> edges) { ... }
public String getName() { ... }
public Set<Edge> getEdges() { ... }
}
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "name")
public Class Edge {
private final String name;
private final Node successor;
public Edge(String name, Node successor) { ... }
public String getName() { ... }
public Node getSuccessor() { ... }
}
Et j'attends d'avoir cette JSON-Structure:
{
"graph": [{
"name": "A",
"edges": [{
"name": "0",
"successor": "B"
}, {
"name": "1",
"successor": "A"
}]
}, {
"name": "B",
"edges": [{
"name": "0",
"successor": "A"
}, {
"name": "1",
"successor": "B"
}]
}]
}
Mais j'obtiens l'erreur suivante lors de la désérialisation (même avec l'annotation @JsonProperty("name")
à la Getters):
com.fasterxml.jackson.databind.JsonMappingException: Invalid Object Id definition for some.package.graph.Node: can not find property with name 'name'
J'ai trouvé quelques solutions pour Jackson 1.6 avec des Annotations de Référence, mais je tiens à utiliser le nouveau Jackson 2.x Annotation, comme il a été annoncé tellement dans l'API mise à Jour à partir de 1.9 à 2.0 de Jackson.
Quel point suis-je manque ici? Merci pour les réponses constructives à l'avance.
MODIFIER
(Supprimé ma réponse d'ici à la section Réponse)
OriginalL'auteur MalteJ | 2014-07-22
Vous devez vous connecter pour publier un commentaire.
J'ai obtenu le genre de blind de regarder trop longtemps. Voici ce qui est allé mal:
La Sérialisation fonctionné comme prévu. Ce qui n'a pas de travail a la Désérialisation, parce que Jackson n'était pas en mesure d'instancier mon Nœud-Objet. J'ai tout simplement oublié de les annoter les paramètres du constructeur méthodes correctement.
J'étais maintenant face à un autre problème. Le JSON généré ressemblait maintenant à ceci:
So far So good. Mais au cours de la cartographie, Jackson me confronte à cette Erreur:
J'ai même changé l'Étiquette de l'bords parce que je pensais que le même nom de propriété pourrait confondre Jackson ici, mais ça n'a pas aidé non plus...
Mon hypothèse ici est que Jackson peut pas référence au Nœud B, car il est encore en cours de construction (on peut dire que c'est en fait une sorte de racine dans cet exemple). Le seul moyen de résoudre ce problème semble de construire tous les Nœuds sans les bords et de les injecter dans une deuxième étape.
Merci pour la mise à jour! Malheureusement, le projet de l'université, que cette fonctionnalité a été prévu, c'est déjà plus avec cette caractéristique d'être mis au rebut. Je vais le garder à l'esprit pour la prochaine fois à l'aide de l'Jackson-Bibliothèque.
Si je prends votre exemple, que faire si je veux l'ensemble de l'objet le nom du nœud A au lieu de "A" comme second élément graphique tableau JSON?
Pourriez vous s'il vous plaît écrivez ce que vous avez fait pour résoudre oublié "pour annoter les paramètres du constructeur méthodes correctement", de sorte que nous pouvons voir de la solution réelle? merci à l'avance!
OriginalL'auteur MalteJ