如何使用 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"
假设我想使用 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"