Haskell: Wiederverwendung von FromJSON-Instanzen mit Linsen, Linsen-AESON und verschachteltem JSON

8

Ich habe mit Aeson und dem Objektivpaket (Objektiv-Aeson, das aus dem Kernlinsenpaket migriert wurde) gespielt und habe versucht, sie zusammenzuarbeiten.

Als Spielzeugbeispiel habe ich einen Typ:

%Vor%

und die FromJSON-Instanz:

%Vor%

So weit so gut.

Nun, sagen wir, ich habe einige verschachtelte JSON-Daten, die ich extrahieren möchte, nur aus:

%Vor%

Mir ist der Rest egal, nur dieser "Farb" -Wert. Um die Sache noch schlimmer zu machen, lassen Sie uns sagen, dass der JSON nicht besonders konsistent ist, also habe ich manchmal

%Vor%

und andere Zeiten

%Vor%

Ich möchte den Farbwert so einfach wie möglich erhalten und dann idealerweise mit meiner FromJSON-Instanz im Idealfall zu einer Farbe parsen. Dies ist ein Spielzeugbeispiel, aber anstelle von Farbe kann der Datentyp eine Anzahl von Feldern usw. aufweisen.

Ich fing an, das Objektiv-Aeson-Zeug zu betrachten, und das hat meine Hoffnungen hoch gemacht; Es erlaubt sehr einfach, in eine JSON-Struktur zu blicken. Beispiel:

%Vor%

Aber ich kann keine Möglichkeit finden, das durch meinen parseJSON-Aufruf auszuführen, um Just Yellow zurückzubekommen. parseJSON scheint nahe daran zu sein, dass es den richtigen Typ (Ding im Inneren des Magischen) zumindest annimmt, danach aber auseinander fällt. Idealerweise wäre ich in der Lage, Folgendes zu tun:

%Vor%

Das nächste, was ich herausgefunden habe, ist das Re-Encoding und dann das Decodieren des Ergebnisses von oben, zB:

%Vor%

Das gibt mir das Bit der JSON-codierten Daten zurück, die ich möchte. In einem komplexeren Fall, wenn diese Daten ein Objekt oder ein Array wären, könnte ich dann decode ausführen, als würde ich normalerweise meinen komplexeren Typ zurückbekommen, aber die Dekodierung mag keinen unpassenden JSON; Dinge, die nicht in Array- oder Objektsyntax eingebettet sind. Darüber hinaus scheint das Dekodieren und Kodieren schrecklich unordentlich und nicht sehr performant zu sein.

Ich bin ziemlich neu für Objektive und Aeson als Ganzes (und Haskell für diese Angelegenheit, obwohl ich angefangen habe, Dinge wie Monaden / Anwendungen im Großen und Ganzen zu verstehen, die so langsam Fortschritte machen!). Wie würdest du das machen lassen?

Meine generelle Motivation ist, dass ich mit einer Menge JSON-Daten arbeiten werde, mich aber eigentlich nur um Fragmente dessen kümmere und es daher eher vermeiden würde, einen Datentyp jedes Mal zu deklarieren, wenn ich diese Fragmente von verschiedenen Stellen aus herausholen muss die JSON, und stattdessen nur Typen für die Bits deklarieren, die mir wichtig sind.

Beachten Sie, dass ich Linse-Aeson-1 und Linse-4.4.0.1 anstelle von Aeson-Linse verwende, die ein wenig anders funktioniert (es könnte in Antworten relevant sein)!

Vielen Dank im Voraus! James

    
jsdw 26.08.2014, 11:02
quelle

1 Antwort

7

Sie können die _JSON Prisma. Sie müssen nur eine ToJSON -Instanz für Colour :

schreiben %Vor%

und dann kannst du es so verwenden:

%Vor%     
bennofs 26.08.2014, 11:57
quelle

Tags und Links