json - 在 Haskell 中解析/导出任意嵌套的 JSON 对象到映射

标签 json haskell aeson

我需要能够将巨大的嵌套 JSON 结构解析为更具延展性的东西,最好是从字符串到字符串的映射。

我正在讨论的结构类型示例:

{ "foo" : "baz", "bar" : {"qux" : "quux", "baz" : {"abracadabra" : "alakazam", "abc" : "xyz" } } }

我想将上面的内容解析为:

fromList [("foo", "baz"), ("bar/qux", "quux"), ("bar/baz/abracadabra", "alakazam"), ("bar/baz/abc", "xyz")]

是否可以将其与 Aeson 相对成熟的解析器一起使用?我是否应该对 Aeson 解析的 JSON AST 进行一些修改,直到它起作用为止?

最佳答案

我在这里无法自拔,我不得不滥用镜头...

在下面的示例中,Primitive 只是叶 JSON 值的一种数据类型。

import Data.Aeson
import Control.Lens
import Data.Aeson.Lens

flatten :: Value -> [(String, Primitive)]
flatten (Object obj) = do
    (k, v) <- obj^@..ifolded
    flatten v <&> _1 <>~ (k^..each ++ "/")
flatten (Array  arr) = arr^..each >>= flatten
flatten prim         = [("", prim^?! _Primitive)]

input = "{ \"foo\" : \"baz\", \"bar\" : {\"qux\" : \"quux\", \"baz\" : {\"abracadabra\" : \"alakazam\", \"abc\" : \"xyz\" } } }"

main = do
    print $ input^? _Value . to flatten
    -- Just [("foo/",StringPrim "baz"),("abc/baz/bar/",StringPrim "xyz"),("abracadabra/baz/bar/",StringPrim "alakazam"),("qux/bar/",StringPrim "quux")]

关于json - 在 Haskell 中解析/导出任意嵌套的 JSON 对象到映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174022/

相关文章:

haskell - 用 aeson 解析 utctime

Haskell, Aeson - (ToJSON ByteString) 没有实例

java - 如何在Java中解析JSON

javascript - 使用angularjs从本地json打印数据

c# - 日期时间.ParseExact : "String not recognised as a valid DateTime"

haskell - 交错功能

javascript - 如何使用此 ajax 函数发布多个输出?

performance - 在 Haskell 的 Data.Binary.Get 中强制顺序处理

arrays - Haskell:有没有比 MArray 更通用的键/值存储类?

haskell - 是否可以在派生 Generic 的记录数据类型中列出字段的名称和类型?