Récupérer les chaînes de tableau JSON à l'aide de Jackson
J'ai trouvé plusieurs réponses qui sont proches de ce que je suis en train de faire, mais pas assez que j'ai été en mesure de l'obtenir pour fonctionner. J'ai un tas de JSON qui ressemble à cet exemple (le seul en fait plusieurs niveaux de plus profond et avec des centaines de postes au niveau je veux accéder): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}
. Je ne peux pas changer le format; c'est quelqu'un d'autre API. Il y a beaucoup de ce que je n'ai pas besoin; en fait je ne veux quelque chose comme un tableau ["bobsyeruncle","easyaspie"]. (Ou d'une Liste ou quoi que ce soit.)
J'ai testé avec une version plus simple du JSON qui ne dispose pas d'un tableau, et a été en mesure d'accéder à une chaîne unique facilement à l'aide de la rootNode.get("requête").get("pages")... manière décrite dans https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608. Mais je n'ai pas été en mesure d'obtenir à la gamme de cette façon. La plupart des réponses que j'ai trouvé ici supposent que je veux créer un POJO comme "Liens" qui inclut à la fois "mot" et "code", dont je n'ai pas. Pour accéder à la les chaînes que je veux, est-il nécessaire de créer quelque chose comme une liste de "Liens" qui incluent à la fois "mot" et "code", et puis de les ignorer "code"? Cela ne semble pas juste.
(D'ailleurs, si quelqu'un pouvait m'indiquer la documentation/tutoriels quelque part entre le JacksonInFiveMinutes tutoriel et l'ensemble de la javadoc, je suis sûr que cela aide aussi.)
ETA cela a fonctionné, je pense!:
String theJsonString = "{\"query\":{\"pages\":{\"links\":"
+ "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(theJsonString);
JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links");
for (int i = 0; i < interestingObjectNode.size(); i ++) {
System.out.println(interestingObjectNode.get(i).path("word").asText());
}
OriginalL'auteur umbraphile | 2011-11-20
Vous devez vous connecter pour publier un commentaire.
Peut-être cette entrée de blog pourrait aider: Traversant JSON arbres avec Jackson?
Je ne suis pas sûr exactement le problème que vous avez, mais une chose à noter est que JSON Tableaux sont parcourus par le passage d'index de l'entrée, PAS le nom. Ainsi, alors que vous utilisez
objectNode.get("key")
, vous utilisezarrayNode.get(0)
à la place.Ou, si vous voulez jouer la sécurité et de permettre de "manque" des entrées, utilisez
arrayNode.path(0)
(et idem pour les Objets JSON).Rappelez-vous aussi que vous pouvez revenir en arrière entre JSON Arbres (
JsonNode
) et Pojo;ObjectMapper
a plusieurs méthodes pour convertir entre représentations (convertValue(), readAsTree(), treeToValue(), valueToTree()). Il est donc possible d'utiliser la liaison de données pour certaines régions, l'arborescence de modèle pour les autres; parfois la liaison sous-arbres de Pojo, d'autres fois juste de liaison de données de haut niveau et d'accéder à des sous-arbres à l'aide du modèle d'arbre. C'est un moyen très puissant pour faire des choses, mais prend un certain temps pour s'y habituer.Espérons que cette aide!
Coffre-fort? ce que u veux dire par "Sûres" que jackson utilisation? @StaxMan
Sûr ce qui signifie que si vous utilisez 'get', et il n'y a pas de nœud correspondant, elle renvoie la valeur null, et doit être vérifié. Mais avec "chemin", un "manque de nœud" est retourné, donc pas de nulle vérifications sont nécessaires.
OriginalL'auteur StaxMan
Dans Google GSON si vous créez un POJO qui manque de certaines propriétés, puis le correspondant JSON est ignoré. Il remplit uniquement les propriétés qui ont des noms identiques. Pourquoi ne pas créer une classe comme ceci :
et ensuite utiliser LambdaJ pour éviter d'écrire toutes les boucles pour obtenir les mots?
Si que n'est pas attrayant ici et essayer JSONPath
Beaucoup de bases de données documentaires comme MongoDB et RavenDB etc utilisation de JSON comme leur format pour le stockage. L'interrogation complexe JSON est construit en eux, utilisent les mêmes bibliothèques qu'ils utilisent.
Question d'origine indiqué que l'utilisation de POJO définitions n'était pas désiré, alors peut-être seulement d'améliorer le libellé de suggérer qu'au lieu de son approche, considèrent encore la liaison de données? (idem pour l'utilisation de jackson vs gson)
OriginalL'auteur Zasz