我希望将传入值序列化为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
我无法理解为什么。
答案 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 "]"