Haskell:
JSON과 함께 일하기
어떻게:
Haskell은 JavaScript와 같은 내장 JSON 지원이 없지만, 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
사용법:
위에 보여진 JSON 데이터를 담고 있는 person.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}
이 예제들은 Aeson을 사용하여 Haskell에서 JSON을 다루는 기본을 보여줍니다. Aeson은 맞춤 파싱 규칙, 복잡한 중첩된 JSON을 다루기 등, 다양한 필요와 시나리오에 적합한 것을 포함하여 훨씬 더 많은 것을 제공한다는 것을 기억하세요.