我正在尝试将JSON字符串转换为ADT
这是我的ADT:
data UserList = UserList
{ userListUsers :: [UserId] }
这是FromJSON
的{{1}}个实例:
UserList
最后这是我的JSON字符串:
instance FromJSON UserList where
parseJSON (Object o) = UserList
<$> ((o .: "relationships") >>= (.: "users") >>= (mapM (.: "id")))
我的 Yesod 服务器正在提供{
"relationships": {
"users": [
{ "type": "User","id": "8" }
]
}
}
,没有任何进一步的帮助,我想我可能无法正确转换400 Bad Request
数组
答案 0 :(得分:3)
<强>更新强>
您的解析器很好,因为您可以使用下面的代码进行测试。你的实现与我用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
答案 1 :(得分:1)
我忘记使用fromPathPiece
,我改为使用符号来使其更漂亮:
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