Gibt es ein Knotenmodul für einen asynchronen JSON-Parser, der nicht die gesamte JSON-Zeichenfolge in den Speicher lädt?

8

Ich stelle fest, dass eine Unmenge von Node-Modulen eine asynchrone API zum Analysieren von JSON bereitstellt , aber viele von ihnen scheinen die gesamte Datei oder den Stream in den Speicher zu lesen, eine riesige Zeichenfolge zu konstruieren und sie dann an JSON.parse() zu übergeben. Dies ist, was die zweite Antwort auf "Wie JSON mit NodeJS zu parsen?" schlägt vor und ist genau das, was das Modul jsonfile.js"> tut

Das Konstruieren einer riesigen Saite ist genau das, was ich vermeiden möchte. Ich möchte eine API wie:

parseJsonFile(pathToJsonFile): Promise

wobei das zurückgegebene Promise in das analysierte JSON-Objekt aufgelöst wird. Diese Implementierung sollte eine konstante Speichermenge verwenden. Ich bin nicht an irgendeiner Art von SAX-artigem Ding interessiert, das Ereignisse überträgt, während verschiedene Stücke geparst werden: nur das Endergebnis.

Ich denke jsonparse kann tun, was ich will (es enthält eindeutig Logik für die Analyse von JSON ohne JSON.parse() ), aber da ist kein einfaches Beispiel in README.md und die eine Datei im Beispielverzeichnis scheint übermäßig kompliziert.

    
bolinfest 17.10.2014, 06:47
quelle

2 Antworten

2

jsonparse ist ein gestreamter JSON-Parser, der Beispielcode zeigt bereits das Minimum der Verwendung des Node-Streams.

  1. Ändern Sie client.request() in fs.createReadStream() .
  2. Setup on('data') Listener im Dateilesestream ähnlich wie in on('response') im Beispiel.
leesei 20.10.2014 06:05
quelle
2

Ich habe ein Modul geschrieben, das dies tut: BFJ (Big-Friendly JSON). Es exportiert eine Reihe von Funktionen, die auf verschiedenen Abstraktionsebenen arbeiten, aber alle asynchron sind und im Kern streamen.

Auf der obersten Ebene befinden sich zwei Funktionen zum Lesen von und Schreiben in das Dateisystem, bfj.read und bfj.write . Sie geben jeweils ein Versprechen ab, also nennt ihr sie so:

%Vor%

Auch auf dieser Ebene gibt es eine Funktion zum Serialisieren von Daten in eine JSON-Zeichenfolge namens bfj.stringify :

%Vor%

Darunter sind zwei weitere generische Funktionen zum Lesen von und Schreiben in Streams, bfj.parse und bfj.streamify . Diese dienen als Grundlage für die Funktionen auf höherer Ebene, aber Sie können sie auch direkt aufrufen:

%Vor%

Auf der untersten Ebene gibt es zwei Funktionen analog zu SAX-Parsern / Serializern, bfj.walk und bfj.eventify . Es ist unwahrscheinlich, dass Sie diese direkt aufrufen möchten, sie sind nur der Kern der Implementierung für die höheren Ebenen.

Es ist Open-Source- und MIT-lizenziert. Weitere Informationen finden Sie in der Readme .

    
Phil Booth 04.04.2015 23:21
quelle

Tags und Links