Haskell Aeson:如何从 IO monad 的解析器中获取价值

McB*_*den 4 monads haskell 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 <- fromJust <$> response .: "name" :: Parser String
  print "hi"
Run Code Online (Sandbox Code Playgroud)

我收到错误:

/home/nut/dev/haskell/elastic/app/Main.hs:39:11: error:
    • Couldn't match type ‘Parser’ with ‘IO’
      Expected type: IO String
        Actual type: Parser String
    • In a stmt of a 'do' block:
Run Code Online (Sandbox Code Playgroud)

那么我如何name从 json 结果中得到它呢?

Cac*_*tus 6

Aeson 有很多功能可以从Parser aa

parse       :: (a -> Parser b) -> a -> Result b
parseEither :: (a -> Parser b) -> a -> Either String b
parseMaybe  :: (a -> Parser b) -> a -> Maybe b
Run Code Online (Sandbox Code Playgroud)

所以如果你有例如

(.: "name") :: Object -> Parser String
Run Code Online (Sandbox Code Playgroud)

那么你有

parseMaybe (.: "name") :: Object -> Maybe String
Run Code Online (Sandbox Code Playgroud)

所以你可以做

{-# 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"
Run Code Online (Sandbox Code Playgroud)