json - 用 Aeson 解析复杂的 json

标签 json haskell

我正在尝试使用 Aeson 库将对 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 但我不确定如何。)我还没有找到像这样分解更复杂的 json 的任何示例。

最佳答案

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

关于json - 用 Aeson 解析复杂的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670072/

相关文章:

c# - System.Text.Json.JsonException : 'A possible object cycle was detected which is not supported....'

haskell - 将树转换为函数图库树的优雅方法?

haskell - 大列表上的单体折叠中的堆栈溢出

haskell - Agda, bool 命题

mysql - Node.js 异步嵌套 mysql 查询

Javascript 使用 jQuery 将查询字符串转换为 JSON,然后返回查询字符串

javascript - 读取JS变量

c# - 根据列值隐藏单个 JSON 值的任何简单方法?

list - Haskell:将函数映射到列表列表

haskell - 无法在终端中运行 ghci