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

问题描述 投票:1回答:1

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

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

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

json haskell aeson
1个回答
2
投票

似乎有一个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"
© www.soinside.com 2019 - 2024. All rights reserved.