Je vais avoir un fichier JSON éventuellement très volumineux et je souhaite diffuser d'elle au lieu de charger tout cela dans la mémoire. Sur la base de la déclaration suivante (j'ai ajouté l'emphase) de JSON: : XS code>
, je crois que cela ne conviendra pas à mes besoins. Existe-t-il un module Perl 5 JSON qui diffusera les résultats du disque? P>
Dans certains cas, il est nécessaire d'analyser progressivement des textes JSON. Bien que ce module
doit toujours conserver un texte JSON et une structure de données Perl résultant en mémoire à la fois forte>, il vous permet d'analyser progressivement un flux JSON. Il le fait en accumulant du texte jusqu'à ce qu'il ait un objet JSON complet, qu'il peut alors décoder. Ce processus est similaire à celui de Decode_Prefix pour voir si un objet JSON complet est disponible, mais est beaucoup plus efficace (et peut être implémenté avec un minimum d'appels de méthode). P> blockQuote> Pour clarifier, le JSON contiendra une gamme d'objets. Je veux lire un objet à la fois du fichier. P>
5 Réponses :
Il le fait en accumulant du texte jusqu'à ce qu'il ait un objet JSON complet, qu'il peut alors décoder. P> blockQuote>
C'est ce qui vous vise. Un document JSON est strong> un objet. P>
Vous devez définir plus clairement ce que vous voulez de l'analyse progressive. Vous recherchez un élément d'une grande cartographie? Qu'essayez-vous de faire avec les informations que vous avez lues / écrits? P>
Je ne connais aucune bibliothèque qui analysera incrémentalement des données JSON en lisant un élément d'un tableau à la fois. Cependant, il est assez simple de vous mettre en œuvre à l'aide d'un automate d'état fini (fondamentalement, votre fichier a le format
\ s * \ [\ s * ([^,] +,) * ([^,] +). * \] \ s * code> sauf que vous devez analyser les chaînes dans les chaînes correctement.) P>
J'ai mis à jour la question, le JSON est un tableau d'objets et je veux un objet à la fois.
Avez-vous essayé d'ignorer le premier braket comme dans le troisième exemple:
http://search.cpan.org/dist/json-xs/xs .pm # exemples p> p> [ code>, puis des virgules
, code>:
Je n'ai encore rien essayé, les Docs semblent dire qu'il conserve toujours des choses en mémoire (c'est-à-dire que, il n'y a pas de rinçage comme XML :: brindille code> a).
En fait, le quatrième exemple semble faire ce que vous voulez
Il semble donc, mais ça a l'air crufty comme l'enfer. Il existe apparemment d'autres modules spécialisés sur CPAN pourraient être capables de cacher ce cruft de moi. Je les regarde maintenant.
Avez-vous regardé JSON :: Streaming :: Reader A > qui apparaît comme le premier lors de la recherche de 'JSON Stream' sur Search.CPAN.org? P>
Alternativement JSON :: SL trouvé en recherchant 'JSON SAX' - Pas tout à fait comme des termes de recherche évidents, mais ce que vous décrivez des sons comme un analgésique SAX pour XML. P>
Je lis les docs vers Json :: SL en ce moment, je vais regarder Json :: Streaming :: Reader Suivant.
En tant qu'auteur de Json :: SL, il offre à la fois une interface type (comme indiqué dans l'exemple ci-dessous) et une interface de type SAX (appelée tuba code>). Ils sont différents et les inconvénients de l'interface de style SAX sont visibles (complexes et lents.)
en termes de facilité d'utilisation et de vitesse, JSON :: SL Code>
semble être le gagnant:
#!/usr/bin/perl use strict; use warnings; use JSON::Streaming::Reader; my $p = JSON::Streaming::Reader->for_stream(\*DATA); my $obj; my $attr; $p->process_tokens( start_array => sub {}, #who cares? end_array => sub {}, #who cares? end_property => sub {}, #who cares? start_object => sub { $obj = {}; }, #clear the current object start_property => sub { $attr = shift; }, #get the name of the attribute #add the value of the attribute to the object add_string => sub { $obj->{$attr} = shift; }, add_number => sub { $obj->{$attr} = shift; }, #object has finished parsing, it can be used now end_object => sub { print "$obj->{n}: $obj->{s}\n"; }, ); __DATA__ [ { "n": 0, "s": "zero" }, { "n": 1, "s": "one" }, { "n": 2, "s": "two" } ]
Si vous avez le contrôle sur la façon dont vous générez votre JSON, je suggère de transformer de jolies formatage et d'imprimer un objet par ligne. Cela fait de l'analyse simple, comme:
Je suppose que vous avez Recherche ... Vous cherchez quelqu'un à garantir module? Mes recherches rudimentaires apportent
JSON :: Streaming :: Reader CODE> < / a> et
JSON :: SL code>
en tant que candidats potentiels, Mais ne savez pas s'ils conviennent à vos besoins.@ZAID J'étais juste en train de regarder les modules JSON, je n'ai pas pensé à inclure le flux au nom (j'ai supposé que cela semble à tort, que les meilleurs chiens auraient cette fonctionnalité).