JSON数组中的Haskell Aeson JSON对象

时间:2016-06-19 14:26:50

标签: json haskell aeson

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

2 个答案:

答案 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