Haskell:
Робота з JSON

Як це зробити:

Haskell не має вбудованої підтримки JSON, як JavaScript, але з допомогою сторонніх бібліотек, таких як Aeson, робота з JSON стає простою. Aeson надає як високорівневі, так і низькорівневі функції для кодування (перетворення значень Haskell у JSON) та декодування (розбір JSON у значення Haskell).

Встановлення Aeson

Спочатку додайте Aeson до залежностей вашого проекту, оновивши ваш файл .cabal або використавши Stack або Cabal безпосередньо:

cabal update && cabal install aeson

або, якщо ви використовуєте Stack:

stack install aeson

Розбір JSON

Почнемо з основного прикладу декодування даних JSON до типу Haskell. Припустімо, у нас є наступний JSON, що представляє особу:

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

Спочатку визначте відповідний тип даних Haskell та зробіть його екземпляром 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

-- Функція для декодування JSON з файлу
decodePerson :: FilePath -> IO (Maybe Person)
decodePerson filePath = do
  personJson <- B.readFile filePath
  return $ decode personJson

Використання: Припускаючи, що person.json містить вищезазначені дані JSON, запустіть:

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

Приклад виводу:

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

Кодування значень Haskell як JSON

Для конвертації значення Haskell назад у JSON, вам потрібно зробити ваш тип екземпляром ToJSON, а потім використати encode.

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

-- Припускаючи тип Person з попереднього прикладу

instance ToJSON Person

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

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

Приклад виводу:

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

Ці приклади демонструють основи роботи з JSON в Haskell за допомогою Aeson. Пам’ятайте, що Aeson пропонує набагато більше, включаючи користувацькі правила розбору, роботу з складними вкладеними JSON та багато іншого, що підходить для різних потреб і сценаріїв.