Как использовать Aeson для получения вектора строк внутри глубокого объекта JSON? - PullRequest
0 голосов
/ 24 февраля 2019

Допустим, я хочу использовать Aeson для анализа следующего объекта JSON:

{
    "data": [
        [ 
            "data",
            "more data"
        ],
        [ 
            "data",
            "more data"
        ]
    ],
    "error": {
        "code": ""
    }
}

Я могу создать записи для объектов JSON, а затем создать экземпляры для анализа фрагментов.как описано в документации.Но меня действительно интересует только Vector Text внутри data.Есть ли более прямой способ добиться этого, чем создание записей?Не очевидно, как создать Parser, который получит мне это напрямую.

1 Ответ

0 голосов
/ 24 февраля 2019

Похоже, есть учебник Aeson, документирующий именно эту проблему: Разбор без создания дополнительных типов

В вашем случае data имеет массивы массивов, так что я неконечно, если вы хотите Vector (Vector Text) или объединить все это в один массив, но адаптируясь из документации:

justData :: Value -> Parser (Vector (Vector Text))
justData = withObject "structure with data" $ \o -> o .: "data"

justDataFlat :: Value -> Parser (Vector Text)
justDataFlat value = fmap join (justData value)

Также обратите внимание, что если ваша структура глубже, как это:

{
    "data": {
        "deep": [
            "data",
            "more data"
        ]
    }
}

Вы можете использовать .: более одного раза:

deeperData :: Value -> Parser (Vector Text)
deeperData = withObject "structure with deeper data" $ \o ->
    step1 <- o .: "data"
    step1 .: "deep"
...