Node.js(Express.jsを使用)を使用して、サーバーからクライアントビューにJSONデータオブジェクトを渡します。
JSONオブジェクトをビューに直接レンダリングすると、期待どおりにページにJSONオブジェクトが表示されます(この仕組み):
pageprovider.findAllTag( function(error, pages){
res.send(pages);
})
そして、私の出力は次のようになります(はるかに大きく、多くのネストされたオブジェクト)
{"green":{"title":"green","pagesContaining": ""}}
次のようにJade Viewに渡そうとすると:
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を取得するにはどうすればよいですか?
何かご意見は?
あなたが電話するとき
_ 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
_はHTMLを出力するためのものであるため、引用符をエンコードします。 HTMLエスケープしないレンダラーを使用するか、少なくともビューを変更して、パラメーターがHTMLエンコードされないようにする必要があります。
出力内の何かをエスケープしたくない場合は、ビュー内で_!{tagsJSON}
_を使用します。ただし、JSONを出力する場合、ビューは必要ありません。オブジェクトを取得するだけで、_JSON.stringify
_を呼び出すことができます。私はJADEを使用していないので、JSON.stringify()
を呼び出すことができるビューを作成する方法があるかどうかはわかりませんが、それはJSP、velocity、ASP、PHPおよびCode Igniter(_JSON.stringify
_を使用せず、代わりに特定の言語のJSONツールを使用します)
ejsでは、その<%- tagsJSON %>
^ <---- Note the "-"
Swig.jsを使用する場合のより良いソリューション
{{ data|json|raw }}
Swigは言及されていないため、バージョンを追加します。
今日この問題に遭遇し、Chart.jsにデータを送信できるように、数時間かけて問題を解決しようとしました: http://www.chartjs.org/docs/
私の場合、Express.jsではなくGeddy.jsを使用していました。元のポスターのように、htmlエスケープされたJSON文字列の問題もありました。
Swigテンプレートエンジンを使用しています。
htmlエスケープについて言及してくれた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 %}