web-dev-qa-db-fra.com

Node.js JSON.stringify () provoquant quot; en sortie. Impossible d'analyser avec Jquery

J'utilise Node.js (avec Express.js) pour passer un objet de données JSON du serveur à la vue client.

Lorsque je rends l'objet JSON directement dans la vue, j'obtiens l'objet JSON affiché sur la page comme prévu (cela FONCTIONNE):

pageprovider.findAllTag( function(error, pages){
    res.send(pages);
})

Et ma sortie ressemble à ceci (beaucoup plus grand, beaucoup d'obj imbriqués)

{"green":{"title":"green","pagesContaining": ""}}

Lorsque j'essaie de le transmettre à ma vue Jade comme ceci:

pageprovider.findAllTag( function(error, tagsJSONObj){
        //res.send(pages);

    pageprovider.findAll( function(error, pages){
        res.render('search_tags.jade', { locals: {
            title: 'Search by Tags',
            'pages': pages,
            tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
            }
        });
    }) //pageprovider.findAll
}) //pageprovider.findAllTag

Le problème
Lorsque je passe "tagsJSON" à la vue, la sortie inclut les entités html:

var obj = jQuery.parseJSON( "{"name": 'value'}");

JQuery renvoie une erreur car il n'aime pas '"'. Comment puis-je obtenir Node pour me donner le devis approprié, ou faire en sorte que jQuery accepte ce format?

Des pensées?

20
Jamis Charles

C'est parce que quand tu appelles

    res.render('search_tags.jade', { locals: {
        title: 'Search by Tags',
        'pages': pages,
        tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
        }
    });

search_tags.jade Est destiné à produire du HTML, il encode donc vos citations. Vous devez utiliser un moteur de rendu qui n'échappe pas au HTML, ou au moins changer votre vue pour que vos paramètres ne soient pas encodés en HTML

Si vous ne voulez pas quelque chose dans la sortie échappée, utilisez !{tagsJSON} Dans la vue. Cependant, lors de la sortie JSON, il n'est pas nécessaire d'avoir une vue. vous pouvez simplement prendre votre objet, appelez JSON.stringify. Je n'utilise pas JADE, donc je ne sais pas s'il existe un moyen de créer une vue qui peut simplement appeler JSON.stringify(), mais c'est ce que j'ai fait dans JSP, velocity, ASP, PHP et Code Igniter (n'utilisant pas JSON.stringify, Il utilise à la place un outil JSON pour le langage donné)

27
Juan Mendes

dans ejs, son <%- tagsJSON %>

          ^ <---- Note the "-"
22
Inshua

Meilleure solution lors de l'utilisation de Swig.js

{{ data|json|raw }}

11
user1001447

Méthode Swig Templating Engine:

Puisque Swig n'a pas été mentionné, j'ajouterai ma version.

J'ai rencontré ce problème aujourd'hui et j'ai passé quelques bonnes heures à essayer de le faire fonctionner pour pouvoir envoyer des données à Chart.js: http://www.chartjs.org/docs/

Dans mon cas, j'utilisais Geddy.js au lieu d'Express.js. Comme l'affiche originale, j'ai également eu le problème de chaîne JSON d'échappement HTML.

J'utilise le moteur de template Swig.

Merci à Juan Mendes d'avoir mentionné l'échappement html , j'ai trouvé cette discussion par le développeur de Swig:

https://github.com/jnordberg/wintersmith-swig/pull/1

Ce qui m'a amené à rechercher une option pour désactiver l'échappement automatique.

J'ai d'abord essayé:

{{ data|raw }} // didn't work

comme cela a été mentionné dans la page github, mais cela n'a pas fonctionné, je suis donc allé dans la documentation et j'ai trouvé ceci:

http://paularmstrong.github.io/swig/docs/tags/

Or! :RÉ

Donc solution finale :

{% autoescape false %}
var data = {{ data }}
{% endautoescape %}
4
Zhang