26

Node.js(Express.jsを使用)を使用して、サーバーからクライアントビューにJSONデータオブジェクトを渡します。

JSONオブジェクトをビューに直接レンダリングすると、期待どおりにページに表示されるJSONオブジェクトが表示されます(これは機能します)。

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

そして、私の出力は次のようになります(はるかに大きく、多くのネストされたobj)

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

次のようにジェイドビューに渡そうとすると、次のようになります。

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

問題
'tagsJSON'をビューに渡すと、出力にhtmlエンティティが含まれます。

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

JQueryは'"'が気に入らないため、エラーをスローします。Nodeに適切な引用符を提供させる、またはjQueryにこの形式を受け入れるようにするにはどうすればよいですか?

何かご意見は?

4

4 に答える 4

30

それはあなたが電話するときだからです。

    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.jadeHTMLを出力するためのものであるため、引用符をエンコードします。HTMLエスケープしないレンダラーを使用するか、少なくともパラメータがHTMLエンコードされないようにビューを変更する必要があります

出力内の何かをエスケープしたくない場合は!{tagsJSON}、ビュー内で使用してください。ただし、JSON を出力する場合、ビューは必要ありません。オブジェクトを取得して、 を呼び出すことができますJSON.stringify。私は JADE を使用しないので、 を呼び出すだけJSON.stringify()のビューを作成する方法があるかどうかはわかりませんが、それは私が JSP、速度、ASP、PHP、および Code Igniter で行ったことです ( を使用せずJSON.stringify、代わりに指定された言語の JSON ツール)

于 2012-06-21T22:13:44.907 に答える
22

ejsでは、その<%- tagsJSON %>

          ^ <---- Note the "-"
于 2012-11-17T09:01:36.403 に答える
11

Swig.js を使用する場合のより良いソリューション

{{ data|json|raw }}

于 2014-03-07T18:33:48.530 に答える
5

Swig テンプレート エンジン メソッド:

Swig について言及されていないので、私のバージョンを追加します。

私は今日この問題に遭遇し、Chart.js にデータを送信できるように、数時間かけて問題を解決しようとしました: http://www.chartjs.org/docs/

私の場合、Express.js の代わりに Geddy.js を使用していました。元のポスターと同様に、html エスケープされた JSON 文字列の問題も発生しました。

Swig テンプレート エンジンを使用しています。

html escapingについて言及してくれた Juan Mendes に感謝します。Swig の開発者による次の議論を見つけました。

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

これにより、自動エスケープを無効にするオプションを検索するようになりました。

私が最初に試した:

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

githubページで言及されていたように、しかしそれはうまくいかなかったので、私はドキュメントに行き、これを見つけました:

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

金!:D

最終的な解決策

{% autoescape false %}
var data = {{ data }}
{% endautoescape %}
于 2013-08-17T16:37:31.677 に答える