Ich verwende eine externe API, die JSON-Antworten zurückgibt. Eine der Antworten ist ein Array von Objekten, und diese Objekte werden durch den Feldwert in ihnen identifiziert. Ich habe Probleme zu verstehen, wie das Parsen einer solchen JSON-Antwort mit Aeson durchgeführt werden kann.
Hier ist eine vereinfachte Version meines Problems:
%Vor% In der API-Dokumentation heißt es, dass das Objekt durch das Feld objectClass mit dem Wert "video" für unser Video -Objekt und "audiobook" für unser
Die Frage ist, wie kann diese Art von JSON mit Aeson angegangen werden?
%Vor% Sie benötigen grundsätzlich eine Funktion Text -> Text -> Media
:
Die FromJSON
Instanz ist jetzt wirklich einfach (mit <$>
und <*>
von Control.Applicative
):
An diesem Punkt sind Sie jedoch redundant: Das objectClass
-Feld in Video
oder Audio
gibt Ihnen nicht mehr Informationen als der tatsächliche Typ, sodass Sie es möglicherweise entfernen können:
Beachten Sie auch, dass toMedia
teilweise ist. Wahrscheinlich möchten Sie ungültige "objectClass"
-Werte abfangen:
Und zuletzt, nicht zuletzt, denken Sie daran, dass gültiger JSON Strings für den Namen verwendet.
Die Standardübersetzung für einen Datentyp wie:
%Vor% ist eigentlich sehr nah an dem, was Sie wollen. (Zur Vereinfachung meiner Beispiele definiere ich ToJSON
Instanzen und codiere die Beispiele, um zu sehen, welche Art von JSON wir erhalten.)
Also, mit der Standardinstanz, die wir haben (view die vollständige Quelldatei , die diese Ausgabe erzeugt:
%Vor%Mal sehen, ob wir mit benutzerdefinierten Optionen noch näher kommen können ...
tagFieldName
Mit benutzerdefinierten Optionen :
%Vor%wir bekommen:
%Vor%(Denken Sie selbst darüber nach, was Sie mit einem undefinierten Feld im echten Code machen möchten.)
constructorTagModifier
Hinzufügen
%Vor% bis mediaJSONOptions
gibt:
Großartig! Genau das, was Sie angegeben haben!
Fügen Sie einfach eine Instanz mit den gleichen Optionen hinzu, um aus diesem Format zu dekodieren:
%Vor%Beispiel:
%Vor% Um ein vollständigeres Bild zu erhalten, schauen wir uns auch an, was generic-aeson
Paket ( hackage ). Es hat auch einige Standard-Übersetzungen, die sich in einigen Punkten von denen von aeson
unterscheiden.
Machen
%Vor%und definieren:
%Vor%gibt das Ergebnis:
%Vor% Es unterscheidet sich also von allem, was wir bei der Verwendung von aeson
gesehen haben.
generic-aesons Optionen ( Einstellungen ) sind für uns nicht interessant (sie erlauben nur das Entfernen eines Präfixes).
( Das Ganze Quelldatei .)
Abgesehen von lower-casing, dem ersten Buchstaben der Konstruktornamen, scheint die Übersetzung von generic-aeson
einer Option ähnlich zu sein, die in aeson
verfügbar ist:
Versuchen wir das:
%Vor%und ja, das Ergebnis ist:
%Vor%TwoElemArray
) Eine verfügbare Option für sumEncoding
wurde aus der obigen Betrachtung herausgelassen, weil es ein Array ergibt, das der geforderten JSON-Darstellung nicht sehr ähnlich ist. Es ist TwoElemArray
. Beispiel:
ist gegeben durch:
%Vor%