Mustache不将JSON值渲染为JSON编码的字符串

时间:2017-02-13 22:55:18

标签: json haskell mustache

完整的例子在这里:

{-# LANGUAGE OverloadedStrings #-}
module Test2 where

import Data.Aeson
import Text.Mustache

main :: IO ()
main = do
  let example = Data.Aeson.object [ "key" .= (5 :: Integer), "somethingElse" .= (2 :: Integer) ]
  print . encode $ example
  print ("Start" :: String)
  case compileTemplate "" "{{{jsonData}}}" of
    Right x -> do
      print $ substituteValue x (Text.Mustache.object ["jsonData" ~= example])
    Left e -> error . show $ e

以上产生以下输出:

"{\"somethingElse\":2,\"key\":5}"
"Start"
"fromList [(\"somethingElse\",2.0),(\"key\",5.0)]"

我的期望是会产生:

"{\"somethingElse\":2,\"key\":5}"
"Start"
"{\"somethingElse\":2,\"key\":5}"

1 个答案:

答案 0 :(得分:1)

Mustache似乎不支持直接替换JSON对象。设置类似示例here,我收到

  

[object Object]

作为输出。与您的不一样,但它表明问题不一定与Haskell实现有关。

换句话说,我认为问题出在您的模板{{{jsonData}}}上。

如果您将其更改为{{{jsonData.somethingElse}}},它可以正常工作(我知道这不是您想要的)。

或者,在将JSON数据传递给替换函数(如建议的here)之前,将其编码为文本。基本上是这样的:

substituteValue x (Text.Mustache.object ["jsonData" ~= (encodeToLazyText jsonData)])

这会产生您想要的输出。 encodeToLazyText中找到了Data.Aeson.Text

工作代码:

{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Data.Aeson ((.=))
import qualified Data.Aeson as A
import           Data.Aeson.Text (encodeToLazyText)
import           Text.Mustache ((~=))
import qualified Text.Mustache as M
import qualified Text.Mustache.Types as M

main :: IO ()
main = do
  print . A.encode $ jsonData
  putStrLn "Start"
  case M.compileTemplate "" "in mustache: {{{jsonData}}}" of
    Right template ->
      print (M.substituteValue template mustacheVals)
    Left e -> 
      error . show $ e

jsonData :: A.Value
jsonData = 
  A.object
    [ "key" .= (5 :: Integer)
    , "somethingElse" .= (2 :: Integer)
    ]

mustacheVals :: M.Value
mustacheVals =
  M.object
    [ "jsonData" ~= encodeToLazyText jsonData
    ]