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. נניח שיש לנו את ה-JJSON הבא המייצג אדם:

{
  "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 מורכב ומקונן ועוד הרבה, המתאימים לצרכים ולתרחישים שונים.