Haskell:
Travailler avec JSON
Comment faire :
Haskell n’a pas de support intégré pour le JSON comme JavaScript, mais avec l’aide de bibliothèques tierces telles que Aeson, la manipulation du JSON devient simple. Aeson fournit à la fois des fonctions de haut niveau et de bas niveau pour l’encodage (convertir des valeurs Haskell en JSON) et le décodage (parser du JSON en valeurs Haskell).
Installer Aeson
D’abord, ajoutez Aeson aux dépendances de votre projet en mettant à jour votre fichier .cabal
ou en utilisant directement Stack ou Cabal :
cabal update && cabal install aeson
ou, si vous utilisez Stack :
stack install aeson
Parser du JSON
Commençons par un exemple basique de décodage de données JSON en un type Haskell. Supposons que nous ayons le JSON suivant représentant une personne :
{
"name": "John Doe",
"age": 30
}
D’abord, définissez un type de données Haskell correspondant et faites-en une instance de 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
-- Fonction pour décoder JSON depuis un fichier
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
personJson <- B.readFile filePath
return $ decode personJson
Utilisation :
En supposant que person.json
contient les données JSON montrées ci-dessus, exécutez :
main :: IO ()
main = do
maybePerson <- decodePerson "person.json"
print maybePerson
Sortie d’exemple :
Just (Person {name = "John Doe", age = 30})
Encodage de valeurs Haskell en tant que JSON
Pour convertir une valeur Haskell de retour en JSON, vous devez faire de votre type une instance de ToJSON
puis utiliser encode
.
import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)
-- En supposant le type Person de précédemment
instance ToJSON Person
encodePerson :: Person -> B.ByteString
encodePerson = encode
main :: IO ()
main = do
let person = Person "Jane Doe" 32
putStrLn $ show $ encodePerson person
Sortie d’exemple :
{"name":"Jane Doe","age":32}
Ces exemples montrent les bases de la manipulation de JSON en Haskell à l’aide d’Aeson. Rappelez-vous, Aeson offre bien plus, incluant des règles de parsing personnalisées, travailler avec du JSON complexe et imbriqué, et bien plus encore, adapté à divers besoins et scénarios.