JSON打印格式
问题描述:
我与该类型JSON打印格式
data J = JObj[(String, J)]
| JArr[J]
| JStr String
工作时给出的输入:
JObj[("problem", "solving")]
我想输出是:
{"problem":"solving"}
但由于JStr是一个列表,它不断打印出来,这是上面指定的JStr的方式,但是它不断打印出{["problem", "solving"]}
不是我想要的。
以下是我有:
show(JStr x) = show x
show(JObj x) = "{" ++ show (foldl (x)) ++ "}"
show(JArr x) = show x
我相信我能在名单上使用地图/倍(是我的错实现?),但我很困惑,如何进一步进行。 我也想过在Data.List中使用intercalate &散布来解决这个问题。 Thrks
答
考虑手头的语法。对于任何一对(String, J)
的JObj
名单里面,我们希望最终看到(s, j)
成为"s": j
jpair :: (String, J) -> String
jpair (s, j) = show s ++ " : " ++ show j
现在,如果我们有一个列表[(String, J)]
那么我们可以生产"s": j
串片段的列表,但我们需要结合他们通过散布逗号而不是滥用Haskell列表语法,其中包括[
和]
括号。
此功能可在Data.List.intersperse
,或者甚至更好,在Data.List.intercalate
intercalate :: [a] -> [[a]] -> [a]
intercalate med = concat . intersperse med
,我们可以使用intercalate
得到我们想要
instance Show J where
show(JStr x) = show x
show(JObj x) = "{" ++ intercalate "," (map jpair x) ++ "}"
show(JArr x) = show x
所以问题是关于显示“{a:b,c:d}”?您可以将答案标记为解决方案。 – vlastachu 2015-01-31 21:33:38