2017-02-13 5 views
1

Полный пример здесь:Усы не оказывающего значение JSON в качестве JSON закодированной строки

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

Какие усов библиотеки вы используете? усы или стаха? – sjakobi

+0

Я использую усы 2.1.2 –

+0

Я не могу воспроизвести ваш результат - первая строка отсутствует. Вы можете это исправить? – sjakobi

ответ

1

Уса, похоже, не поддерживает прямую замену объектов JSON. Настройка подобного примера here, получает

[объект 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 
    ] 
+0

Я неправильно предполагал, что функциональность JSON связана с рендерингом значений JSON. –

Смежные вопросы