1

Java で作成した JSON 文字列をパラメーターとして、サーブレットから呼び出された Javascript メソッドに渡しています。ただし、JSON 文字列を渡すと、Firebug は渡された文字列について警告します。

Java コード:

String jsonString = "{\"id\":1,\"name\":\"Joe Smith\",\"data\":{\"email\":\"smith@gmail.com\",\"phone\":\"555-123-4567\",\"title\":\"CFO\",\"instanceControllerTagLibraryApi\":{\"developmentMode\":false}},\"children\":[],\"instanceControllerTagLibraryApi\":{\"developmentMode\":false}}";

pw.println("<body onload=\"init('"+jsonString+"');\">");

Javascript:

function init(text){
    alert(text);
}

パス中に文字列を引用し、一重引用符を削除しようとしました。どちらも基本的に、渡される文字列が中括弧を (何らかの方法で) エスケープする必要があるという事実を示しています。

エラー (一重引用符):

SyntaxError: 終了していない文字列リテラル [このエラーでブレーク]

初期化('{

4

2 に答える 2

4

エラーは JSON 文字列ではなく、別のコードにあります。

pw.println("<body onload=\"init('"+jsonString+"');\">");onload イベントを追加しようとするのは本当に大雑把な試みです。

JSON 文字列を HTML 文字列に追加しようとしないでください。JSON 文字列を二重にエスケープしない限り、引用符のために機能しません。これはばかげています。

現在、出力は次のようになります。

<body onload="init('{"id":1, ... }');">
                     ^--- syntax error after this

JS コードを実行しようとしますinit('{

于 2012-09-11T23:57:27.930 に答える
2

Frits は問題を解決できました。私は間違いなく彼のアドバイスに従い、すぐに使用をやめbody onloadます。

例えば:

(function run(){
    var data = '{"id":1,"name":"Joe Smith","data":{"email":"smith@gmail.com","phone":"555-123-4567","title":"CFO","instanceControllerTagLibraryApi":{"developmentMode":false}},"children":[],"instanceControllerTagLibraryApi":{"developmentMode":false}}';

    function init(){
        console.log(data, JSON.parse(data));
    }

    if (window.addEventListener) {
        window.addEventListener('load', init);
    } else if (window.attachEvent) {
        window.attachEvent('load', init);
    }
​})();​

http://jsfiddle.net/userdude/eQRBk/1/

(および古い IE バージョンwindow.addEventListenerのレガシー)の使用に注意してください。window.attachEventそして、それconsole.logは Chrome と Firebug でうまく機能します。私の意見では、IE のコンソールは、オブジェクトをログに記録する方法が少しイライラします。

あなたが与えたものを使用して、別の方法で処理することができます (そして、私はそうすべきだと思います)。申し訳ありませんが、私は Java に精通しておらず、JSP しか知りません (かろうじて)。そう...?

<%

String jsonString = "'{\"id\":1,\"name\":\"Joe Smith\",\"data\":{\"email\":\"smith@gmail.com\",\"phone\":\"555-123-4567\",\"title\":\"CFO\",\"instanceControllerTagLibraryApi\":{\"developmentMode\":false}},\"children\":[],\"instanceControllerTagLibraryApi\":{\"developmentMode\":false}}'";

%>
<script>
(function run(){
    var data = <%=jsonString%>;

    function init(){
        console.log(data, JSON.parse(data));
    }

    if (window.addEventListener) {
        window.addEventListener('load', init);
    } else if (window.attachEvent) {
        window.attachEvent('load', init);
    }
​})();​
</script>

そして、その JSP ページをheadまたはに挿入するbodyと、問題なく動作します。また、そのデータを JSP ページに動的に挿入するように設定できると思います。でも、言ったように、私はここで手を振っています。

于 2012-09-12T00:32:26.407 に答える