Parse Json Rose Tree с Хаскеллом Эсоном - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь проанализировать рекурсивные данные JSON, что-то вроде этого:

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

Теперь я хочу реализовать экземпляр FromJSON, чтобы я мог декодировать его в структуру данных следующим образом: следующая структура данных

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

Понятия не имею, как это сделать. Я видел только примеры того, как получать экземпляры для плоских (нерекурсивных) структур JSON с использованием Aeson.

1 Ответ

0 голосов
/ 10 сентября 2018

Как предположил Виллем фон Онсем, намного проще, если вы определите данные следующим образом:

data Tree = Node { value :: Text, children :: [Tree]}, просто используя пустой список для представления (также в json) пустых поддеревьев. Затем вы просто анализируете JSON напрямую, просто получая fromJSON типа данных.

Другая идея заключается в использовании Data.Tree, у которого уже есть производный экземпляр fromJSON. Для Data.Tree JSON должен быть структурирован примерно так:

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