小胡子未将 JSON 值呈现为 JSON 编码字符串

Mustache not rendering JSON value as JSON encoded string

完整示例在这里:

{-# 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}"

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

[object Object]

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

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

如果你把它改成{{{jsonData.somethingElse}}},它工作正常(我知道这不是你想要的)。

或者,将 JSON 数据编码为文本,然后按照建议 将其传递给替换函数。基本上是这样的:

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

这会产生您想要的输出。 encodeToLazyTextData.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
    ]