【问题标题】:Escaped double quotes in JSON string causing error while parsingJSON字符串中的转义双引号导致解析时出错
【发布时间】:2015-06-30 20:04:13
【问题描述】:

我正在使用 GSON 将 List(Map(String,String)) 转换为 json 字符串并通过会话将其传递给前端。 GSON 正确地使用 /" 转义了双引号,但是在解析 json 字符串时出现了问题。

生成的JSON字符串是

[{"queueList": [{"Name": "Queue\"1\""}, {"Name": "Queue2"}, {"Name": "Queue3"}, {"Name": "Queue4"}]}]

解析时我在 chrome 中遇到的错误是:“UnExpected Number”

我用来解析的代码如下

 $(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);
});
});

以下是上述代码存在问题的小提琴链接 http://jsfiddle.net/vinaybvk/qvwL9246/2/

当 JSON 字符串有 \\" 时,上面的小提琴按预期工作正常。
工作转义的 JSON 字符串如下:

var menuItemsStr = '[{"queueList": [{"Name": "Queue\\"1\\""}, {"Name": "Queue2"}, {"Name": "Queue3"}, {"Name": "Queue4"}]}]';

我无法找到在 " 之前添加 \\ 以使行为正常工作的方法。我正在尝试使用 java 和 javascript。
我在 javascript 中尝试做的是在 cmets 的上述小提琴中
我在java中尝试做的是 str.replaceAll("\"", "\\\\\\")); 它使用 \\\"

生成字符串

请让我知道有什么办法可以纠正这个问题或者我做错了什么。

谢谢。

【问题讨论】:

  • 你为什么需要使用JSON.parse()this is what I mean
  • 当您在 javascript 中按字面意思编写字符串时,您需要对其进行双重转义,一个用于 javascript 解析器,一个用于 JSON 解析器。
  • 嗨 Pointy 我正在使用 parse 将字符串转换为 JSON 对象,以便我可以对其进行解析并对其进行迭代。嗨,Adeneo,即使我直接从服务器获取字符串,它的行为方式也是一样的。我正在使用类似这样的东西来填充 JSP var jsonStr = ''; 中的变量
  • 这就像字面意思一样,因为服务器把它写成文字字符串
  • Pointy 是有道理的,为什么不把它写成一个对象呢,javascript 支持,不需要引号。

标签: java javascript jquery json gson


【解决方案1】:

而不是引用字符串然后解析它,在这种情况下你可以这样做:

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

这会产生一个有效的对象。

【讨论】:

  • 我尝试了上述选项,但它也抛出了 JS 错误,因为“意外的令牌 {”错误在我共享的小提琴和我正在使用的 web 应用程序中都是一样的
  • @Vinay 你必须展示你的服务器如何打印字符串的代码,因为这是问题所在。
  • 我在我的动作类中使用 gson.toJSON(str) 生成的值做了一个 sysout,它给出的字符串为 [{"queueNamesList": [{"Name": "Inbasket"} , {"Name": "Lending Option\"s\""}, {"Name": "Work Queue"}]}] 在 JSP 页面中,我使用的代码是 var jsonFormattedResult = ''; 这与我在帖子中提到的 var jsonFormattedResult = '[ {"queueNamesList": [{"Name": "Inbasket"}, {"Name": "Lending Option\"s\""}, {"Name": "Work Queue"}]}]';
  • 根据您的输入,我将 JSP 代码更改为 var jsonFormattedResult = {{}} ; 它给出的输出为 var jsonFormattedResult = {{[{"queueNamesList": [{"Name": "Inbasket"}, {"Name": "Lending Option\"s\""} , {"Name": "工作队列"}]}]}};
  • @Vinay 感谢您的更新。我根据它用我的固定代码更新了我的答案。
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2019-10-14
  • 2013-01-06
相关资源
最近更新 更多