разбор сложных json-файлов с помощью Aeson

Я пытаюсь преобразовать вызов API в тип записи haskell, используя Библиотека Aeson

Я использую страницы википедии и разбираю их на заголовок и список ссылок. Примером может быть этот

{"query":{"pages":{"6278041":{"pageid":6278041,"ns":0,"title":"Lass","links":[{"ns":0,"title":"Acronym"},{"ns":0,"title":"Dead Like Me"},{"ns":0,"title":"Donna Lass"},{"ns":0,"title":"George Lass"},{"ns":0,"title":"Girl"},{"ns":0,"title":"Lassana Diarra"},{"ns":0,"title":"Lightning Lass"},{"ns":0,"title":"Real Madrid"},{"ns":0,"title":"Shadow Lass"},{"ns":0,"title":"Solway Lass"},{"ns":0,"title":"Szymon Lass"},{"ns":0,"title":"The Bonnie Lass o' Fyvie"},{"ns":0,"title":"The Tullaghmurray Lass"},{"ns":0,"title":"Woman"},{"ns":12,"title":"Help:Disambiguation"}]}}}}

, и я хотел бы разобрать его на заголовок и список ссылок в таком типе данных.

data WikiPage = WikiPage { title :: String,
                           links :: String }

У меня сейчас есть такой код:

instance FromJSON WikiPage where
  parseJSON j = do
    o <- parseJSON j
    let id = head $ o .: "query" .: "pages" 
    let name = o .: "query" .: "pages" .: id .: "title"
    let links = mapM (.: "title") (o .: "query".: "pages" .: id .: "links")
    return $ WikiPage name links

Я получаю сообщение об ошибке,

Couldn't match expected type `Data.Text.Internal.Text'
                with actual type `[Char]'
    In the second argument of `(.:)', namely `"title"'

Я действительно не понимаю, что происходит, я чувствую, что должна быть проблема с тем, как я отображаю ссылки, но я не совсем уверен, что нужно делать. Я также не понимаю, как я должен использовать id во второй строке запроса, поскольку это синтаксический анализатор (я уверен, что мне нужно где-то здесь использовать аппликатив, но я не уверен, как). Я не нашел любые примеры, которые разбирают более сложные jsons, подобные этому.

9
задан Stephen Olsen 6 October 2011 в 03:32
поделиться