我有这么丑陋的代码部分:

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/

10-10 13:56
查看更多