使用Aeson库解析JSON时,可以使用默认值来解析前一个解析的值。
以下是一个使用Aeson库解析JSON的示例代码,其中使用了前一个解析的默认值:
{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson
import Data.Aeson.Types (Parser)
import qualified Data.ByteString.Lazy as B
data MyData = MyData
{ field1 :: String
, field2 :: Int
} deriving (Show)
instance FromJSON MyData where
parseJSON = withObject "MyData" $ \obj -> do
-- 使用前一个解析的默认值
field1Val <- obj .:? "field1" .!= "defaultField1"
field2Val <- obj .:? "field2" .!= 0
return $ MyData field1Val field2Val
main :: IO ()
main = do
-- 从文件中读取JSON字符串
jsonStr <- B.readFile "data.json"
-- 解析JSON字符串为MyData对象
let maybeMyData = decode jsonStr :: Maybe MyData
-- 打印解析结果
case maybeMyData of
Just myData -> print myData
Nothing -> putStrLn "Failed to parse JSON"
在上面的代码中,我们定义了一个MyData
类型,并为其实现了FromJSON
实例。在parseJSON
函数中,我们使用withObject
函数将JSON对象转换为MyData
类型。
在parseJSON
函数中,我们使用了.:?
函数来解析字段值,.!=
函数用于提供默认值。如果字段在JSON中不存在或者解析失败,则会使用默认值进行解析。
在main
函数中,我们从文件中读取JSON字符串,然后使用decode
函数将其解析为Maybe MyData
类型的值。最后,我们根据解析结果打印相应的信息。
需要注意的是,代码中使用了OverloadedStrings
语言扩展,可以直接使用字符串字面量作为JSON字段名称。如果没有启用该语言扩展,可以使用fromString
函数将字符串转换为Text
类型。
上一篇:Aeson嵌套记录的编码
下一篇:Aeson无法找到我认为存在的键