小胡子未将 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)])
这会产生您想要的输出。 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
]
完整示例在这里:
{-# 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)])
这会产生您想要的输出。 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
]