2016-06-19 2 views
0

Je suis en train de convertir un JSON String en un ADTHaskell Aeson JSON objet à l'intérieur JSON Tableau

Ceci est mon ADT:

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

Ceci est mon FromJSON exemple pour UserList:

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

enfin ceci est mon JSON chaîne:

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

Mon Yessod serveur donne 400 Bad Request, sans aucune aide supplémentaire, je pense que je ne convertira le tableau users correctement

Répondre

1

J'ai oublié d'utiliser fromPathPiece, j'ai changé pour faire la notation pour le rendre plus joli:

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 
3

Mise à jour

Votre analyseur est bien comme vous pouvez le tester avec le code au dessous de. Votre implémentation est la même que celle que j'ai écrite avec do-notation.

Réponse originale

Cela devrait fonctionner:

{-# 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

Merci, changer mon Le code pour faire une notation m'a aidé à réaliser ce qui me manquait ('fromPathPièce'). – FtheBuilder