用Aeson解析复杂的json

时间:2011-10-06 03:32:24

标签: json haskell

我正在尝试使用Aeson Library将对API的调用解析为haskell记录类型

我正在使用维基百科页面,并将它们解析为标题和链接列表。 一个样本就是这个,

{"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,因为它是一个解析器(我确定我需要在这里使用applicative但我不确定如何。)我还没有找到任何像这样分解更复杂的jsons的例子。

1 个答案:

答案 0 :(得分:15)

我也在试图找出一个人。我遇到了同样的问题,我通过在源文件的顶部添加{-# LANGUAGE OverloadedStrings #-}来解决它。我对Haskell很新,但我相信它增加了对该语言的非官方扩展,大概是允许字符串加倍作为其他类似字符串的数据类型。