1

我将在 Java 中创建的 JSON 字符串作为参数传递给从我的 servlet 调用的 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:未终止的字符串文字 [Break On This Error]

在里面('{

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/

注意使用window.addEventListener(以及window.attachEvent旧 IE 版本的遗留)。这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 页面插入到heador 中body,它会正常工作。我还想象您可以将其设置为将该数据动态注入到 JSP 页面中。但是,就像我说的,我有点在这里挥手。

于 2012-09-12T00:32:26.407 回答