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 ที่มีโครงสร้างซับซ้อน และอื่นๆ อีกมากที่เหมาะสำหรับความต้องการและสถานการณ์ที่หลากหลาย