如何使用 Aeson 获取深度 JSON 对象中的字符串向量?

How to use Aeson to get a vector of strings inside a deep JSON object?

假设我想使用 Aeson 来解析以下 JSON 对象:

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

我可以为 JSON 个对象创建记录,然后创建实例来像文档中描述的那样解析这些片段。但是,我真的只对 data 里面的 Vector Text 感兴趣。有没有比创建记录更直接的方法?如何创建直接让我得到这个的 Parser 并不明显。

似乎有一个 Aeson 教程正好记录了这个问题:Parsing without creating extra types

在你的例子中,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"