我需要能够将巨大的嵌套 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/