Haskell:
Arbeiten mit JSON
Wie:
Haskell hat keine integrierte Unterstützung für JSON wie JavaScript, aber mit Hilfe von Drittanbieterbibliotheken wie Aeson wird die Handhabung von JSON unkompliziert. Aeson bietet sowohl High-Level- als auch Low-Level-Funktionen für das Kodieren (Umwandeln von Haskell-Werten in JSON) und Dekodieren (Parsen von JSON in Haskell-Werte).
Aeson installieren
Fügen Sie zunächst Aeson zu den Abhängigkeiten Ihres Projekts hinzu, indem Sie Ihre .cabal
-Datei aktualisieren oder Stack oder Cabal direkt verwenden:
cabal update && cabal install aeson
oder, wenn Sie Stack verwenden:
stack install aeson
JSON parsen
Beginnen wir mit einem grundlegenden Beispiel für das Dekodieren von JSON-Daten in einen Haskell-Typ. Angenommen, wir haben das folgende JSON, das eine Person darstellt:
{
"name": "John Doe",
"age": 30
}
Definieren Sie zunächst einen entsprechenden Haskell-Datentyp und machen Sie ihn zu einer Instanz von FromJSON
:
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic)
import Data.Aeson (FromJSON, decode)
import qualified Data.ByteString.Lazy as B
data Person = Person
{ name :: String
, age :: Int
} deriving (Generic, Show)
instance FromJSON Person
-- Funktion, um JSON aus einer Datei zu dekodieren
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
personJson <- B.readFile filePath
return $ decode personJson
Verwendung:
Angenommen, person.json
enthält die oben gezeigten JSON-Daten, führen Sie aus:
main :: IO ()
main = do
maybePerson <- decodePerson "person.json"
print maybePerson
Beispielausgabe:
Just (Person {name = "John Doe", age = 30})
Haskell-Werte als JSON kodieren
Um einen Haskell-Wert zurück in JSON umzuwandeln, müssen Sie Ihren Typ zu einer Instanz von ToJSON
machen und dann encode
verwenden.
import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)
-- Unter der Annahme des Person-Typs von zuvor
instance ToJSON Person
encodePerson :: Person -> B.ByteString
encodePerson = encode
main :: IO ()
main = do
let person = Person "Jane Doe" 32
putStrLn $ show $ encodePerson person
Beispielausgabe:
{"name":"Jane Doe","age":32}
Diese Beispiele demonstrieren die Grundlagen der Arbeit mit JSON in Haskell unter Verwendung von Aeson. Denken Sie daran, Aeson bietet viel mehr, einschließlich benutzerdefinierten Parsing-Regeln, Arbeit mit komplex verschachteltem JSON und vieles mehr, geeignet für verschiedene Bedürfnisse und Szenarien.