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
我正在尝试将 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