haskell - Parse Array in nested JSON with Aeson -
i'm trying write fromjson
function aeson.
the json:
{ "total": 1, "movies": [ { "id": "771315522", "title": "harry potter , philosophers stone (wizard's collection)", "posters": { "thumbnail": "http://content7.flixster.com/movie/11/16/66/11166609_mob.jpg", "profile": "http://content7.flixster.com/movie/11/16/66/11166609_pro.jpg", "detailed": "http://content7.flixster.com/movie/11/16/66/11166609_det.jpg", "original": "http://content7.flixster.com/movie/11/16/66/11166609_ori.jpg" } } ] }
the adt: data movie = movie {id::string, title::string}
my attempt:
instance fromjson movie parsejson (object o) = movies <- parsejson =<< (o .: "movies") :: parser array v <- head $ decode movies return $ movie <$> (v .: "movies" >>= (.: "id") ) <*> (v .: "movies" >>= (.: "title") ) parsejson _ = mzero
this gives couldn't match expected type 'parser t0' actual type 'maybe a0' in first argument of 'head'
.
as can see, i'm trying pick first of movies in array
, wouldn't mind getting list of movies either (in case there several in array).
if want parse single movie
json array of movies, can this:
instance fromjson movie parsejson (object o) = movievalue <- head <$> o .: "movies" movie <$> movievalue .: "id" <*> movievalue .: "title" parsejson _ = mzero
but safer route parse [movie]
via newtype
wrapper:
main = print $ movielist <$> decode "{\"total\":1,\"movies\":[ {\"id\":\"771315522\",\"title\":\"harry potter , philosophers stone (wizard's collection)\",\"posters\":{\"thumbnail\":\"http://content7.flixster.com/movie/11/16/66/11166609_mob.jpg\",\"profile\":\"http://content7.flixster.com/movie/11/16/66/11166609_pro.jpg\",\"detailed\":\"http://content7.flixster.com/movie/11/16/66/11166609_det.jpg\",\"original\":\"http://content7.flixster.com/movie/11/16/66/11166609_ori.jpg\"}}]}" newtype movielist = movielist {movielist :: [movie]} instance fromjson movielist parsejson (object o) = movielist <$> o .: "movies" parsejson _ = mzero data movie = movie {id :: string, title :: string} instance fromjson movie parsejson (object o) = movie <$> o .: "id" <*> o .: "title" parsejson _ = mzero
Comments
Post a Comment