web-dev-qa-db-ja.com

Node.js JSON.stringify()が原因の引用;出力で。 Jqueryで解析できません

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を取得するにはどうすればよいですか?

何かご意見は?

20
Jamis Charles

あなたが電話するとき

_    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ツールを使用します)

27
Juan Mendes

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

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

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

{{ data|json|raw }}

11
user1001447

Swigテンプレートエンジンの方法:

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 %}
4
Zhang