【问题标题】:jQuery parseJSONjQuery 解析JSON
【发布时间】:2011-08-23 21:34:43
【问题描述】:

当我尝试解析 JSON 验证字符串时收到此错误(“JSON.parse:意外字符”)。当我删除需要转义的字符(style="width:400px;")时,它工作得很好。我错过了什么?在使用 parseJSON 之前是否有一种独特的方式来转义字符?

var $cookieString = '{"youTabItems": { "youTab-001": <p style=\"width:400px;\">Welcome to my test</p>, "youTab-002": "test02Value", "youTab-003": "test03Value" }}';

var $myCookieString = $.parseJSON($cookieString);

logThis($myCookieString);

更新

在我开始保存/从 cookie 中检索之前,我能够使其大部分工作。现在,它在分号后切断内容......对此有什么想法吗?我正在使用我在 quirsmode.com 上找到的 3 个函数来实现 cookie 功能(如下所示)。

        function setCookie(name, value, days) { var date, expires; if (days) { date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toGMTString(); } else { expires = ""; } document.cookie = name + "=" + value + expires + "; path=/"; }
        function getCookie(name) { var nameEQ = name + "=", ca = document.cookie.split(';'), c, i; for (i = 0; i < ca.length; i++) { c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1, c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } } return null; }
        function eraseCookie(name) { setCookie(name, "", -1); }

        var cookieObject = {"youTabItems": { "youTab-001": "<p style=\"width:400px;\">Welcome to my test</p>", "youTab-002": "test02Value", "youTab-003": "test03Value" }};
        var cookieString = JSON.stringify($cookieVal);
        setCookie('youTabItems', cookieString, 28);

【问题讨论】:

标签: jquery json parsing escaping character


【解决方案1】:
var $cookieString = '{"youTabItems": { "youTab-001": "<p style=\\"width:400px;\\">Welcome to my test</p>", "youTab-002": "test02Value", "youTab-003": "test03Value" }}';

var $myCookieString = $.parseJSON($cookieString);

将您的 html 包装为字符串以使 JSON 有效。

为什么要用双斜线?

黑斜线是 JavaScript 字符串中的转义字符。这意味着我们必须自己转义它来创建一个 literal blackslash。我们需要一个文字反斜杠作为 JSON 中的转义字符。

例子:

var json = '{"foo": "\\""}';

将创建字符串

{"foo": "\""}

这是有效的 JSON。如果我们只有一个反斜杠,它会创建

{"foo": """}

这是无效的。

注意:这只是因为您的 JSON 在 JavaScript 字符串中才需要。如果你服务它,例如作为 HTTP 响应,那么您只需要一个反斜杠。但是无论您使用什么来创建 JSON,都会自动转义引号,因此您不必处理它。

更新

将数据存储在 cookie 中的更好方法是:

var cookieObject = {"youTabItems": { "youTab-001": "<p style=\"width:400px;\">Welcome to my test</p>", "youTab-002": "test02Value", "youTab-003": "test03Value" }};
var cookieString = JSON.stringify(cookieObject);

【讨论】:

  • 您不需要在引号前转义斜杠(除非您要转义斜杠字符本身)。仅包含第一项就足够了。
  • 嗯,这取决于。如果您实际上是直接在 JavaScript 中创建 JSON 文本,则需要它,否则解析器会将 " 视为关闭该值。 jsfiddle.net/vSwWg
  • 但话又说回来,我不确定您为什么要在 JavaScript 中创建 JSON 格式的字符串,以便将其解析为 JavaScript 对象。为什么不首先使用文字?
  • @Mark:它在字符串中创建一个文字斜杠,作为 JSON 解析器的转义字符 (\\" -> \")。但正如 patrick 所说,为什么不直接创建一个对象呢?如果你从其他地方(不是 JS 字符串)提供 JSON,你只需要一个斜杠。
  • @Mark:如果您创建一个 JS 对象并将 HTML 设置为字符串(正确转义)然后使用JSON.stringify,它应该可以正常工作:jsfiddle.net/fkling/Yz3DA
【解决方案2】:

第一项没有用引号括起来:

"youTab-001": "<pstyle=\"width: 400px;\">Welcometomytest</p>",

【讨论】:

    【解决方案3】:
    <p style=\"width:400px;\">Welcome to my test</p>
    

    它是一个字符串值吗?那么它必须被引用

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2015-05-18
      • 2013-01-21
      • 2014-08-28
      • 2012-05-14
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多