完整的例子在这里:
{-# 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}"
答案 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
]