Haskell:
Työskentely JSON:n kanssa

Miten:

Haskellissa ei ole sisäänrakennettua tukea JSONille kuten JavaScriptissä, mutta kolmannen osapuolen kirjastojen, kuten Aesonin, avulla JSONin käsittely muuttuu suoraviivaiseksi. Aeson tarjoaa sekä korkean tason että matalan tason funktioita koodaukseen (Haskell-arvojen muuntaminen JSONiksi) ja dekoodaukseen (JSONin jäsentäminen Haskell-arvoiksi).

Aesonin asentaminen

Lisää ensin Aeson projektisi riippuvuuksiin päivittämällä .cabal-tiedostosi tai käyttämällä Stackia tai Cabalia suoraan:

cabal update && cabal install aeson

tai, jos käytät Stackia:

stack install aeson

JSONin jäsentäminen

Aloitetaan perusesimerkillä, jossa dekoodataan JSON-data Haskell-tyypiksi. Oletetaan, että meillä on seuraava JSON henkilöstä:

{
  "name": "John Doe",
  "age": 30
}

Määritä ensin vastaava Haskell-datatyypi ja tee siitä FromJSON-instanssi:

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics (Generic)
import Data.Aeson (FromJSON, decode)
import qualified Data.ByteString.Lazy as B

data Henkilo = Henkilo
  { nimi :: String
  , ika :: Int
  } deriving (Generic, Show)

instance FromJSON Henkilo

-- Funktio JSONin dekoodaamiseksi tiedostosta
dekoodaaHenkilo :: FilePath -> IO (Maybe Henkilo)
dekoodaaHenkilo tiedostopolku = do
  henkiloJson <- B.readFile tiedostopolku
  return $ decode henkiloJson

Käyttö: Olettaen, että person.json sisältää yllä näytetyn JSON-datan, suorita:

main :: IO ()
main = do
  maybeHenkilo <- dekoodaaHenkilo "person.json"
  print maybeHenkilo

Esimerkkituloste:

Just (Henkilo {nimi = "John Doe", ika = 30})

Haskell-arvojen koodaus JSONiksi

Muuntaaksesi Haskell-arvon takaisin JSONiksi, sinun on tehtävä tyypistäsi ToJSON-instanssi ja sitten käytettävä encode-funktiota.

import Data.Aeson (ToJSON, encode)
import GHC.Generics (Generic)

-- Olettaen aikaisemmin määritellyn Henkilo-tyypin

instance ToJSON Henkilo

koodaaHenkilo :: Henkilo -> B.ByteString
koodaaHenkilo = encode

main :: IO ()
main = do
  let henkilo = Henkilo "Jane Doe" 32
  putStrLn $ show $ koodaaHenkilo henkilo

Esimerkkituloste:

{"nimi":"Jane Doe","ika":32}

Nämä esimerkit demonstroivat JSONin peruskäsittelyä Haskellissa käyttäen Aesonia. Muistathan, että Aeson tarjoaa paljon muutakin, mukaan lukien mukautetut jäsentelysäännöt, monimutkaisen sisäkkäisen JSONin käsittelyn ja paljon muuta, mikä soveltuu erilaisiin tarpeisiin ja skenaarioihin.