Haskell:
Praca z JSON

Jak:

Haskell nie ma wbudowanego wsparcia dla JSON, tak jak JavaScript, ale z pomocą bibliotek stron trzecich, takich jak Aeson, obsługa JSON staje się prosta. Aeson oferuje zarówno funkcje wysokiego, jak i niskiego poziomu do kodowania (konwertowanie wartości Haskell na JSON) oraz dekodowania (parsowanie JSON do wartości Haskell).

Instalacja Aeson

Najpierw dodaj Aeson do zależności swojego projektu, aktualizując plik .cabal lub bezpośrednio używając Stack lub Cabal:

cabal update && cabal install aeson

lub, jeśli używasz Stack:

stack install aeson

Parsowanie JSON

Zacznijmy od podstawowego przykładu dekodowania danych JSON na typ Haskell. Załóżmy, że mamy następujący JSON reprezentujący osobę:

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

Najpierw zdefiniuj odpowiadający mu typ danych Haskell i uczyn go instancją 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

-- Funkcja do dekodowania JSON z pliku
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
  personJson <- B.readFile filePath
  return $ decode personJson

Sposób użycia: Zakładając, że person.json zawiera powyższe dane JSON, uruchom:

main :: IO ()
main = do
  maybePerson <- decodePerson "person.json"
  print maybePerson

Przykładowy wynik:

Just (Person {name = "John Doe", age = 30})

Kodowanie wartości Haskell jako JSON

Aby przekonwertować wartość Haskell z powrotem na JSON, musisz uczynić swój typ instancją ToJSON, a następnie użyć encode.

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

-- Zakładając typ Person z poprzednich przykładów

instance ToJSON Person

encodePerson :: Person -> B.ByteString
encodePerson = encode

main :: IO ()
main = do
  let person = Person "Jane Doe" 32
  putStrLn $ show $ encodePerson person

Przykładowy wynik:

{"name":"Jane Doe","age":32}

Te przykłady demonstrują podstawy pracy z JSON w Haskellu, używając Aeson. Pamiętaj, że Aeson oferuje znacznie więcej, w tym niestandardowe reguły parsowania, pracę z zagnieżdżonym JSONem i wiele innych, odpowiednie dla różnych potrzeb i scenariuszy.