使用管道将值序列化为JSON数组

时间:2015-11-01 11:11:19

标签: json haskell aeson haskell-pipes

我希望将传入值序列化为JSON。每个值都有一个 setResponsePage(new Main("address",2,0,1)); 实例。最终结果应该是一个列表。当前代码如下:

toJSON

问题是,这样每行都包含一个有效的JSON对象,但我希望整个结果都是可解析的。我想在第一个对象输出import Pipes import qualified Pipes.Prelude as P -- assume a source of elements main :: IO () main = runEffect $ source >-> P.map encode >-> P.stdoutLn 字符之前,然后每个元素后跟一个逗号,最后是另一个[。我怎么能用管道来做这件事?

当前输出:

]

期望的输出:

$ prog
{"key": "value"}
{"key": "value"}

我找到了pipe-aeson,但我不明白我该如何使用它提供的功能。

编辑:我修改了ErikR的答案以获得$ prog [{"key": "value"}, {"key": "value"}] ,但它没有输出结束括号:

Consumer

我无法理解为什么。

1 个答案:

答案 0 :(得分:1)

此管段:

for cat $ \x -> lift $ do { putStr ", "; putStrLn x }

将在管道中的每个元素之前发出逗号。

为了给第一个元素特殊处理,我们只展开一次循环:

insertCommas = do
  x1 <- await
  lift $ putStrLn x1      -- print first element w/o a comma
  for cat $ \x -> lift $ do { putStr ", "; putStrLn x }

现在,您可以将流式JSON管道编写为:

putStr "["
runEffect $ source >-> P.map encode >-> insertCommas
putStrLn "]"