Haskell:
การทำงานกับ JSON

วิธีการ:

Haskell ไม่มีการรองรับ JSON ในตัวเหมือนกับ JavaScript แต่ด้วยการช่วยเหลือจากไลบรารีของบุคคลที่สาม เช่น Aeson การจัดการกับ JSON จึงเป็นเรื่องง่าย Aeson ให้ทั้งฟังก์ชันระดับสูงและระดับต่ำสำหรับการเข้ารหัส (แปลงค่าของ Haskell เป็น JSON) และการถอดรหัส (แปลง JSON เป็นค่าของ Haskell)

การติดตั้ง Aeson

ก่อนอื่น เพิ่ม Aeson เข้าไปใน dependencies ของโปรเจกต์ของคุณโดยการอัปเดตไฟล์ .cabal หรือใช้ Stack หรือ Cabal โดยตรง:

cabal update && cabal install aeson

หรือ หากคุณใช้ Stack:

stack install aeson

การถอดรหัส JSON

เรามาเริ่มต้นด้วยตัวอย่างเบื้องต้นของการถอดรหัสข้อมูล JSON เป็นประเภทข้อมูลของ Haskell สมมติว่าเรามี JSON ต่อไปนี้ที่แสดงถึงคนหนึ่งคน:

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

ก่อนอื่น กำหนดประเภทข้อมูล Haskell ที่สอดคล้องกันและทำให้มันเป็น instance ของ 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 คุณจำเป็นต้องทำให้ประเภทของคุณเป็น instance ของ 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 ที่มีโครงสร้างซับซ้อน และอื่นๆ อีกมากที่เหมาะสำหรับความต้องการและสถานการณ์ที่หลากหลาย