我有这么丑陋的代码部分:
request <- parseUrl "someUrl.com"
res <- withManager $ httpLbs request
case decode $ responseBody res :: Maybe Aeson.Value of
Just (Aeson.Object jsonObject) ->
case (HashMap.lookup "aaa" jsonObject) of
Just a ->
case a of
Aeson.Object jsonObject2 ->
case (HashMap.lookup "bbb" jsonObject2) of
Just b ->
case b of
Aeson.Object jsonObject3 ->
case (HashMap.lookup "ccc" jsonObject3) of
Just c ->
case c of
Array d ->
case (d ! 1) of
String a -> print a
_ -> error "error!!!"
_ -> error "error!!"
_ -> error "error!!"
_ -> error "error!!"
_ -> error "error!!"
_ -> error "error!!"
_ -> error "error!!"
_ -> error "Invalid JSON"
它运行良好,但看起来不太好。我如何简化它?我很肯定有办法做到这一点。
请注意,我是 而不是 使用任何自定义数据类型来解析 JSON 并且不想这样做。
最佳答案
do
monad 的 Maybe
语法:
request <- parseUrl "someUrl.com"
res <- withManager $ httpLbs request
let toPrint =
do Aeson.Object jsonObject <- decode $ responsBody res
Aeson.Object jsonObject2 <- HashMap.lookup "aaa" jsonObject
Aeson.Object jsonObject3 <- HashMap.lookup "bbb" jsonObject2
Array d <- HashMap.lookup "ccc" jsonObject3
String a <- return $ d ! 1
return a
case toPrint of
Just a -> print a
Nothing -> "Invalid JSON"
关于json - 解析 JSON 中的嵌套值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24473093/