Streaming-Analyse von JSON in Haskell mit Pipes.Aeson

9

Die Pipes.Aeson-Bibliothek macht die folgende Funktion verfügbar:

%Vor%

Wenn ich evalStateT mit diesem Parser und einem Datei-Handle als Argument verwende, wird ein einzelnes JSON-Objekt aus der Datei gelesen und analysiert.

Das Problem ist, dass die Datei mehrere Objekte (alle des gleichen Typs) enthält und ich sie beim Lesen falten oder reduzieren möchte.

Pipes.Parse bietet:

%Vor%

Aber wie Sie sehen, gibt dies einen neuen Parser zurück - ich kann mir keinen Weg vorstellen, den ersten Parser als Argument bereitzustellen.

Es sieht so aus, als ob ein Parser eigentlich ein Producer in einem StateT-Monade-Transformer ist. Ich habe mich gefragt, ob es eine Möglichkeit gibt, den Producer aus dem StateT zu extrahieren, so dass evalStateT auf den foldAll Parser und den Producer aus dem decode Parser angewendet werden kann.

Dies ist jedoch wahrscheinlich völlig falsch.

Meine Frage, kurz:
Wenn Sie eine Datei mit Pipes.Aeson analysieren, was ist der beste Weg, um alle Objekte in der Datei zu falten?

    
immutablestate 17.05.2014, 18:28
quelle

1 Antwort

4

Anstatt decode zu verwenden, können Sie die decoded Parsing-Linse von Pipes.Aeson.Unchecked . Es macht einen Produzenten von ByteString zu einem Produzenten geparster JSON-Werte.

%Vor%

Der Rückgabewert von intProducer ist etwas beängstigend, aber es bedeutet nur, dass intProducer entweder mit einem Parsingfehler und den nicht geparsten Bytes nach dem Fehler oder mit dem Rückgabewert des ursprünglichen Produzenten (der% ist) beendet wird. co_de% in unserem Fall).

Wir können den Rückgabewert ignorieren:

%Vor%

Und schließen Sie den Produzenten an eine Seite an von () , wie Pipes.Prelude :

%Vor%

In ghci:

%Vor%

Beachten Sie auch, dass die Funktionen rein und unrein können Sie sich auf Herstellerfalten anwenden, die in der foldl Paket.

    
danidiaz 17.05.2014, 19:54
quelle