L'utilisation de Jackson À Flux Analyser un Tableau d'Objets Json
J'ai un fichier qui contient un tableau json d'objets:
[
{
"test1": "abc"
},
{
"test2": [1, 2, 3]
}
]
Je souhaite utiliser Jackson JsonParser de prendre un inputstream à partir de ce fichier, et à chaque appel .next(), je veux le retour d'un objet à partir de la matrice jusqu'à ce qu'il est à court d'objets ou d'échec.
Est-ce possible?
Cas d'utilisation:
J'ai un gros fichier avec un tableau json rempli d'un grand nombre d'objets avec différents schémas. Je veux obtenir un objet à la fois pour éviter de charger le tout dans la mémoire.
EDIT:
J'ai complètement oublié de le mentionner. Mon entrée est une chaîne qui est ajouté au fil du temps. Il s'accumule lentement json au fil du temps. J'espérais être capable de l'analyser en objet en objet la suppression de l'objet analysé à partir de la chaîne.
Mais je suppose que ce n'est pas grave! Je peux le faire manuellement, aussi longtemps que le jsonParser sera de retour l'index dans la chaîne.
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez est appelé Jackson Streaming API. Voici un extrait de code à l'aide de Jackson Streaming API qui pourrait vous aider à obtenir ce dont vous avez besoin.
Oui, vous pouvez obtenir ce genre de partie-streaming-partie-arbre-modèle de style de traitement à l'aide d'un
ObjectMapper
:parser.nextToken()
juste après la boucle while, je devrais être de lire le prochain objet, après ce qui est juste en cours de lecture, correct?readTree
donné un analyseur positionné sur leSTART_OBJECT
consomment des événements à partir de l'analyseur jusqu'à ce qu'il atteigne la correspondanceEND_OBJECT
et laisser l'analyseur est positionné sur cette.com.fasterxml.jackson.core.JsonParseException: Unexpected character (',' (code 44)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
exception. Mais un JSON liste est censé être séparés par des virgules, donc je ne sais pas pourquoi Jackson est de se plaindre... des conseils?{"foo": ,"bar":"baz"}
). Ou peut-être si vous avez une série d'objets à haut niveau qui sont séparés par des virgules, mais pas entouré par l'ensemble de la matrice de crochets ([]
) - je sais que cette technique peut résister à une bien formé array ([{...},{...}]
) ou un flux d'objets ({...}{...}
), mais pas si vous avez les virgules sans les crochets.{...}{...}{...}
)C'est une réponse tardive qui s'appuie sur Ian Roberts réponse. Vous pouvez également utiliser un JsonPointer pour trouver la position de départ si elle est imbriquée dans un document. Cela évite de codage personnalisé légèrement encombrant streaming jeton approche pour obtenir le point de départ. Dans ce cas, le basePath est "/", mais il peut être de n'importe quel chemin que JsonPointer comprend.