JSON字符串中转义的双引号导致解析时出错

3
我将使用GSON将List(Map(String,String))转换为JSON字符串,并通过会话将其传递给前端。 GSON会适当地将双引号转义为 /",但问题出现在解析JSON字符串时。
生成的JSON字符串为:
[{"queueList": [{"Name": "Queue\"1\""}, {"Name": "Queue2"}, {"Name": "Queue3"}, {"Name": "Queue4"}]}]

我在使用Chrome解析时遇到的错误是:"意外的数字"

我正在使用以下代码进行解析:

 $(document).ready(function () {
var menuItemsStr = '[{"queueList": [{"Name": "Queue\"1\""}, {"Name": "Queue2"}, {"Name": "Queue3"}, {"Name": "Queue4"}]}]';
var menuItems = $.parseJSON(menuItemsStr);
$.each(menuItems[0].queueList, function (idx, obj) {
    var listItemHTML = $("#listItem").clone().html();
    listItemHTML = listItemHTML.replace(/\@QN/g, obj.Name);

    $("#list").append(listItemHTML);
});
});

以下是包含问题代码的fiddle链接: http://jsfiddle.net/vinaybvk/qvwL9246/2/ 当JSON字符串有\\"时,上面的fiddle按预期正常工作。 下面是有效的转义JSON字符串:
var menuItemsStr = '[{"queueList": [{"Name": "Queue\\"1\\""}, {"Name": "Queue2"}, {"Name": "Queue3"}, {"Name": "Queue4"}]}]';

我无法找到在Java和JavaScript中添加\\来使行为正常的方法。

我正在尝试JavaScript中上面评论中的内容,Java中我正在尝试str.replaceAll("\"", "\\\\\")); 这将生成带有\\\"的字符串。

请告诉我是否有任何方法可以纠正这个问题或者我做错了什么。

谢谢。


1
你为什么需要使用JSON.parse()呢?这就是我的意思 - Pointy
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - adeneo
嗨Pointy,我正在使用解析器将字符串转换为JSON对象,以便我可以解析它并遍历其中的内容。嗨Adeneo,即使我直接从服务器获取字符串,它的行为也是一样的。我正在使用类似于以下内容来填充JSP中的变量:var jsonStr = '<%session.getAttribute(“key”)。toString()%>'; - Vinay
这就像直接编写代码一样,服务器会将其作为字面字符串编写。 - adeneo
1
Pointy 有一点道理,为什么不将其写成一个对象呢?JavaScript 支持这种方式,不需要在其周围添加引号。 - adeneo
显示剩余3条评论
1个回答

2

不需要引用字符串再解析,可以直接这样做:

var menuItems = <s:property value="#session['jsonFormattedResult']" escapeHtml = "false" />;

这将导致一个有效的对象。


我尝试了上述选项,但它也会抛出JS错误,如“意外的token {”错误,在我分享的fiddle和我正在使用的Web应用程序中出现的错误是相同的。 - Vinay
@Vinay,你需要展示代码来说明服务器是如何打印字符串的,因为这就是问题所在。 - tcooc
我在我的Action类中使用了gson.toJSON(str)生成的值,并通过sysout打印出来,结果是**[{"queueNamesList": [{"Name": "Inbasket"}, {"Name": "Lending Option"s""}, {"Name": "Work Queue"}]}]。在JSP页面中,我使用的代码是var jsonFormattedResult = '<s:property value="#session['jsonFormattedResult']" escapeHtml = "false" />';,这个代码与我在帖子中提到的代码类似,如下所示:var jsonFormattedResult = '[{"queueNamesList": [{"Name": "Inbasket"}, {"Name": "Lending Option"s""}, {"Name": "Work Queue"}]}]';**。 - Vinay
根据您的输入,我将JSP代码更改为var jsonFormattedResult = {{<s:property value="#session['jsonFormattedResult']" escapeHtml = "false" />}}; 它的输出为 **var jsonFormattedResult = {{[{"queueNamesList": [{"Name": "Inbasket"}, {"Name": "Lending Option"s""}, {"Name": "Work Queue"}]}]}};**。 - Vinay
@Vinay 感谢您的更新。我根据它更新了我的答案,并修复了代码。 - tcooc
谢谢,这个工作得很好,只有一个小问题,就是当某个点没有会话变量时,那一行会给出JS错误,所以我正在进行if else条件分配null的操作。更新后的工作代码如下: <s:if test="#session.jsonFormattedResult==null"> jsonFormattedResult = null; </s:if> <s:else> jsonFormattedResult = <s:property value="#session['jsonFormattedResult']" escapeHtml = "false" />; </s:else> - Vinay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接