【问题标题】:Parse Json Rose Tree with Haskell Aeson用 Haskell Aeson 解析 Json 玫瑰树
【发布时间】:2018-09-07 08:40:03
【问题描述】:

我正在尝试解析递归 JSON 数据,如下所示:

{
    "node": "a",
    "children": [
        {
            "node": "b",
            "children": [
                {
                    "node": "c",
                    "children": null
                }
            ]
        },
        {
            "node": "d",
            "children": null
        }
    ]
}

现在我想实现一个 FromJSON 的实例,这样我就可以将它解码成这样的数据结构: 以下数据结构

data Tree = Node { value :: Text, children :: [Tree]} | Nothing

我不知道该怎么做。我只看到了有关如何使用 Aeson 为平面(非递归)JSON 结构派生实例的示例。

【问题讨论】:

  • 这里的问题更多的是你使用null而不是一个空列表。此外,为什么要在这里创建构造函数Nothing?如果没有null 的情况,这实际上与非平面数据完全相同。
  • 你是对的。如果你只是使用空列表来表示没有孩子,那真的很简单!
  • 那么...问题解决了吗?
  • @lsund 手动 define custom FromJSON/ToJSON 实例应该很简单。你需要帮助吗? (如果不是,您也可以回答自己的问题,我们鼓励这样做!)
  • 我回答了我自己的问题。谢谢大家

标签: json haskell aeson


【解决方案1】:

正如 Willem von Onsem 所建议的,如果您像这样定义数据,这会简单得多:

data Tree = Node { value :: Text, children :: [Tree]},只使用一个空列表来表示(也在 json 中)空子树。然后,您只需通过导出数据类型的fromJSON 直接解析 json。

另一个想法是使用Data.Tree,它已经有fromJSON 的派生实例。对于 Data.Tree,JSON 的结构必须像这样:

["a",["b",[]]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多