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?
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.
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
:
In ghci:
%Vor%Beachten Sie auch, dass die Funktionen rein und unrein können Sie sich auf Herstellerfalten anwenden, die in der foldl Paket.
Tags und Links haskell parsing json aeson haskell-pipes