2017-02-13 1 views
1

L'exemple complet est ici:Mustache ne rendant pas la valeur JSON en tant que chaîne codée 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 

Le produit ci-dessus la sortie suivante:

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

Mon attente est-il produirait:

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

Quelle bibliothèque moustache utilisez-vous? moustache ou stache? – sjakobi

+0

J'utilise la moustache 2.1.2 –

+0

Je ne peux pas reproduire votre sortie - la première ligne est manquante. Pouvez-vous résoudre ce problème? – sjakobi

Répondre

1

Moustache ne semble pas prendre en charge la substitution directe d'objets JSON. Mise en place d'un exemple similaire here, je reçois

[object Object]

en sortie. Pas identique à la vôtre, mais cela indique que le problème n'est pas nécessairement lié à la mise en œuvre de Haskell. En d'autres termes, je crois que le problème est avec le modèle {{{jsonData}}}.

Si vous le modifiez à {{{jsonData.somethingElse}}}, cela fonctionne très bien (je sais que ce n'est pas ce que vous voulez).

Vous pouvez également encoder les données JSON sous forme de texte avant de les transmettre à la fonction de substitution, comme suggéré here. Fondamentalement quelque chose comme ceci:

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

Il en résulte dans votre sortie souhaitée. encodeToLazyText est trouvé dans Data.Aeson.Text.

Code de travail:

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

Je suppose à tort la fonctionnalité JSON avait à voir avec le rendu des valeurs JSON. –