JSON打印格式

时间:2015-01-31 20:43:11

标签: json printing

我正在使用

类型
data J = JObj[(String, J)]
     | JArr[J]
     | JStr String

给出输入时:

JObj[("problem", "solving")]

我希望输出为:

{"problem":"solving"}

但是由于JStr是一个列表,它会不断打印{["problem", "solving"]} 这是JStr在上面指定的方式,但不是我想要的。

这就是我所拥有的:

  show(JStr x) = show x
  show(JObj x) = "{" ++ show (foldl (x)) ++ "}"
  show(JArr x) = show x

我相信我可以在列表中使用map / fold(我的实现是错误的?),但我对如何继续进行感到困惑。 我还想过使用插入&穿插在Data.List中来解决这个问题。 Thnks

1 个答案:

答案 0 :(得分:2)

考虑手头的语法。对于(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

中提供
intersperse :: a -> [a] -> [a]

或者更好,在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