要将JSON对象解析为列表,可以使用Aeson库。下面是一个示例代码:
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import qualified Data.ByteString.Lazy as B
import Control.Exception
data Person = Person
{ name :: String
, age :: Int
} deriving (Show)
instance FromJSON Person where
parseJSON (Object v) = do
name <- v .: "name"
age <- v .: "age"
return $ Person name age
parseJSON _ = fail "Invalid object"
main :: IO ()
main = do
-- 从JSON文件中读取字节串
json <- catch (B.readFile "data.json") handleIOError
-- 解析JSON字节串为Person对象列表
let result = eitherDecode json :: Either String [Person]
-- 处理解析结果
case result of
Left err -> putStrLn $ "Error parsing JSON: " ++ err
Right people -> putStrLn $ "Parsed JSON: " ++ show people
handleIOError :: IOException -> IO B.ByteString
handleIOError _ = return "{}"
在这个示例中,我们定义了一个Person
数据类型,它有一个FromJSON
实例。FromJSON
是Aeson库的一个类型类,它定义了如何将JSON值解析为Haskell类型。在parseJSON
函数中,我们使用.:
操作符从JSON对象中获取相应的字段。
在main
函数中,我们首先使用B.readFile
函数从文件中读取JSON字节串。然后,我们使用eitherDecode
函数将JSON字节串解析为Either String [Person]
类型。eitherDecode
函数是Aeson库提供的一个函数,它可以将JSON解析为指定类型的值。
最后,我们使用case
语句处理解析结果。如果解析成功,我们打印出解析后的Person对象列表;如果解析失败,我们打印出错误信息。
请注意,在上面的示例中,我们假设JSON文件的路径是"data.json"。您需要根据实际情况修改该路径。此外,如果无法打开JSON文件,我们使用一个简单的错误处理函数handleIOError
返回一个空的JSON对象。