Haskell Aeson:如何在IO monad中从解析器中获取值
我正在尝试在IO中进行JSON解析:Haskell Aeson:如何在IO monad中从解析器中获取值,haskell,monads,aeson,Haskell,Monads,Aeson,我正在尝试在IO中进行JSON解析: {-# LANGUAGE OverloadedStrings #-} import Network.HTTP.Simple import Data.Aeson import Data.Maybe (fromJust) main :: IO () main = do response <- getResponseBody <$> httpJSON "http://localhost:9200" :: IO Object name &
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Simple
import Data.Aeson
import Data.Maybe (fromJust)
main :: IO ()
main = do
response <- getResponseBody <$> httpJSON "http://localhost:9200" :: IO Object
name <- fromJust <$> response .: "name" :: Parser String
print "hi"
那么如何从json结果中获得
名称?Aeson有一系列函数可以从解析器a
到解析器a
:
parse :: (a -> Parser b) -> a -> Result b
parseEither :: (a -> Parser b) -> a -> Either String b
parseMaybe :: (a -> Parser b) -> a -> Maybe b
所以如果你有,例如
(.: "name") :: Object -> Parser String
那你有
parseMaybe (.: "name") :: Object -> Maybe String
所以你可以
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Simple
import Data.Aeson
import Data.Maybe (fromJust)
import Data.Aeson.Types -- new import for parseMaybe
main :: IO ()
main = do
response <- getResponseBody <$> httpJSON "http://localhost:9200"
let name = fromJust $ parseMaybe (.: "name") response :: String
print "hi"
{-#语言重载字符串}
导入Network.HTTP.Simple
导入数据.Aeson
导入数据。可能(fromJust)
import Data.Aeson.Types--新导入的数据类型
main::IO()
main=do
response看起来您正试图绑定响应的结果。IO
中的“name”
,但它只是一个解析器
值。我对Aeson不是很熟悉,但我认为您需要(纯粹)使用Data.Aeson.Types.parse
或parseMaybe
运行解析器。现在我有点困惑。它不是(.:“name”)::Value->解析器字符串吗?对象
的类型是值
?很抱歉对伊森图书馆感到困惑…是的,这是正确的。整个表达式来自$parseMaybe(.:“name”)response
,我们将其注释为具有typeString
(.:“name”)::Value->Parser String
,以及response::Value
,因此我们可以应用parseMaybe::(a->Parser b)->a->b
可能带有a~值和b~字符串
。当然,如果我们只是将名称
用于任何规定其类型的内容(例如将最后一行从print“hi”
更改为putStrLn$unwords[“hi,,name]
),那么我们就不需要let name=…
行中的类型注释了。我不熟悉多态性,因此解释很有帮助。:)谢谢!
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Simple
import Data.Aeson
import Data.Maybe (fromJust)
import Data.Aeson.Types -- new import for parseMaybe
main :: IO ()
main = do
response <- getResponseBody <$> httpJSON "http://localhost:9200"
let name = fromJust $ parseMaybe (.: "name") response :: String
print "hi"