Haskell Aeson JSON Object inside JSON Array

Haskell Aeson JSON Object inside JSON Array

我正在尝试将 JSON 字符串转换为 ADT

这是我的ADT:

data UserList = UserList
  { userListUsers :: [UserId] }

这是我的 FromJSON 实例 UserList:

instance FromJSON UserList where
  parseJSON (Object o) = UserList
    <$> ((o .: "relationships") >>= (.: "users") >>= (mapM (.: "id")))

最后这是我的 JSON 字符串:

{
  "relationships": { 
    "users": [
      { "type": "User","id": "8" }
    ]
  }
}

我的 Yesod 服务器正在提供 400 Bad Request,没有任何进一步的帮助,我想我可能没有正确转换 users 数组

更新

您的解析器没有问题,您可以使用下面的代码进行测试。你的实现和我用do-notation写的一样。

原答案

这应该有效:

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Stringable
import Control.Monad

type UserId = String

data UserList = UserList
  { userListUsers :: [UserId] }
  deriving (Show)

instance FromJSON UserList where
  parseJSON (Object o) = 
    do  r <- o .: "relationships"
        u <- r .: "users"
        idents <- forM u $ \x -> x .: "id"
        return $ UserList idents

test = do
  contents <- readFile "in"
  let e = eitherDecode (toLazyByteString contents) :: Either String UserList
  print e

我忘了用fromPathPiece,为了更漂亮,我改成了do-notation:

instance FromJSON UserList where
  parseJSON (Object o) = do  
    r <- o .: "relationships"
    u <- r .: "users"
    ids <- forM u $ \x -> do
      id <- x .: "id"
      return $ fromJust . fromPathPiece $ id
    return $ UserList ids