当字符串值包含逗号时,JSON.parse 在 Safari 中失败

2024-07-01

我正在构建一个购物车,当按下“购买”按钮时,Web 服务会返回一个 JSON 输出,然后我将其作为字符串保存到 Javascript cookie 中。

Web 服务的典型返回可能是:

{
   "d":{
      "58658":{
         "id":"58658",
         "qty":"1",
         "singlePrice":"754",
         "salePrice":"754",
         "isBulk":"0",
         "isSor":"0",
         "vatRate":"20.00",
         "masterCat":"6",
         "imgUrl":"http://...img url",
         "singleWeight":"18000",
         "totalAvailableStock":"2",
         "thirdPartyStock":"",
         "item":"Electrovoice Live X Elx115p, Each " // << HERE IS THE ISSUE
      }       
   }
}

当返回结果如上所示时,仅在 Safari 中会失败

我花了很多时间试图找到一些有用的机制来调试这个问题,而无需购买 Mac,我终于找到了:

"item":"Electrovoice Live X Elx115p, Each " // << HERE IS THE ISSUE - The comma

The itemvalue 在字符串中有一个逗号,我将返回值保存到 cookie 中,如下所示:

cookies.set('shopping_cart', JSON.stringify(result)); // (where result is the JSON above)

当我稍后尝试回忆时:

var shopping_cart = cookies.get('shopping_cart');
shopping_cart = JSON.parse(shopping_cart);

它在每个浏览器中都能正常工作,显然,甚至是 Internet Explorer...除了 Safari

我没有 Mac,所以不确定 Mac 上的 Safari 是否有什么不同,但 Windows 版本肯定有这个错误,我的 iPhone 和 iPad 上也是如此。

错误是:

JSON parse error, unterminated string.

正如我所说,这似乎只是 Safari 中的问题,但我很难找到解决方案。

非常感谢帮助!

EDIT:

我创建了一个小提琴:http://jsfiddle.net/jhartnoll/2GLEz/ http://jsfiddle.net/jhartnoll/2GLEz/这个 Fiddle 将复制这个问题,它与将数据作为字符串存储在 Cookie 中并将其重新解析为 JSON 有关

但是,因为我已将 Cookie 函数作为外部资源包含在内(http://www.sam.thinkka.com/clientscripts/cookie_test.js http://www.sam.thinkka.com/clientscripts/cookie_test.js)您需要确保 Safari 不会阻止第三方 cookie。


好的,现在我们已经找到了实际问题的根源,我想我可以提供帮助。

问题基本上是您将数据存储到 cookie 字符串中但没有转义它。因此,当您设置cookie并且其中包含逗号时,逗号可以被视为cookie分隔符。对于大多数字符串,JSON 中的引号似乎掩盖了这种效果(引号也是 cookie 的相关字符),但对于这个字符串,它被 cookie 解析器视为分隔符。

这反过来意味着它被视为 cookie 的末尾,这意味着当您将其加载回来时,它会在该点被截断。

解决方案:在将字符串保存为 cookie 之前对其进行转义。 (你的makeCookie()函数应该执行此操作)。你应该能够使用JSescape()为此功能。

See cookie 规范 https://www.rfc-editor.org/rfc/rfc6265,并注意逗号、双引号、分号等都是 cookie 的相关字符。

也可以看看:这个类似的问题 http://social.msdn.microsoft.com/Forums/en-us/cf1f79c9-75ac-4ae5-9337-e5f12e01b3e8/cannot-call-set-cookies-because-my-cookie-list-contains-commas?forum=vststest

至于为什么它发生在 Safari 而不是其他浏览器中……我想这可能是运气的原因。也许其他浏览器的 cookie 解析器认识到逗号后面的以下字符串无效,因此发现逗号不适合作为分隔符。

您可能还想查看MDN cookie 文章 http://mdn.beonex.com/en/DOM/document.cookie.html其中包括示例 JS cookie 库的代码,该库确实执行了所有正确的转义。您可能需要考虑使用此库而不是您自己当前的代码。 (或者至少是其中的一部分)

希望有帮助。

最后,有点偏离主题,但使用 cookie 时需要注意的另一件事是:不要忘记,对于您网站上发出的每个单独的 http 请求,整个 cookie 字符串都会在两个方向上传输。因此,如果您有 4k 的 cookie 数据,则意味着您网站上的每个 html、css、js 和图像文件需要额外的 8k 带宽。

如果您使用大型 cookie,则可以使用其他方法来存储本地数据,而不会出现此问题。本文 http://www.sitepoint.com/html5-browser-storage-past-present-future/可能对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当字符串值包含逗号时,JSON.parse 在 Safari 中失败 的相关文章

  • 控制台日志不打印函数中的变量

    尝试将变量 randomWord 打印到console log 但chrome说它没有定义 看起来它是为我定义的 为什么它不会打印到console log function strt get random word from words a
  • 如何使用 JQuery 3.3.1 和 Bootstrap 3.3.7 设置日期选择器?

    我必须为几种不同形式的输入字段设置日期选择器 过去我使用过 jQuery 日期选择器 但在这个项目中我使用 Bootstrap 3 所以还有另一种方法可用 这是我到目前为止的例子 document ready function datepi
  • 如何获取 Firebase ID

    有人知道如何获取 Firebase 唯一 id 吗 我试过了name name key key 什么都不起作用 我可以看到数据 但不知道如何取回 id 我需要它 Create new customers into firebase func
  • 将框架外页面重定向到index.htm中的特定框架

    我在 index html 文件上使用框架 在框架的每个页面上 我都有一个代码来检查页面是否在框架中 如果没有 则重定向到index html 现在 我不仅想检查页面是否在框架中并重定向到index html 而且还想在index html
  • d3.js 雷达图 - 填充线条之间

    我正在尝试在其中两个三角形之间创建填充 例如在红色和绿色三角形之间创建红色填充 有人知道如何做到这一点吗 我见过另一个雷达图的例子 我相信它做了类似的事情 尽管我认为他们使用CSS而不是d3创建填充 使用径向图用 mbostock 的答案解
  • javascript 权限被拒绝访问属性

    我在从不同的 iframe 访问属性时遇到问题 我不断收到此权限被拒绝访问属性错误 我见过有人多次询问他们是否使用 file 但没有人 除了我 所以这个问题永远不会得到解决 我不会在网络上这样做 我所有帧的 src 都位于硬盘驱动器上的同一
  • 在 emberjs 中绑定子视图和集合

    我正在尝试渲染视图Team里面一个 outlet This Team视图由一个简单的Person视图 团队领导者 以及集合Person意见 团队成员 插座是通过调用设置的connectOutlet 在应用程序控制器上 虽然Person子视图
  • Rails 通过 ajax 发出闪光通知

    长话短说 我有一个按钮 单击它时 我希望触发一个 ajax 请求 该请求获取 flash notice 并将其显示在 中的 div 中 这是我的简短观点
  • 每个内每个内每个

    我是新使用 JSON 和 getJSON 函数等 我正在尝试从 JSON 中获取数据 该 JSON 会下降几个级别并且可以有多个子级 目前 我可以通过将 each 与另一个 each 一起使用来查看我想要的值 例如 each data fu
  • Javascript 逗号列表,但最后一个有一个 and

    我正在尝试创建一个函数 它将接受单词列表 并将其转换成这样的句子 jsfiddle http jsfiddle net 0ht35rpb 107 http jsfiddle net 0ht35rpb 107 数组列表 contents 0
  • chrome 对象 console.log 中的奇怪行为

    当我尝试在 Chrome 中 console log 一个对象时 它在 console log 的第一行中指出 您可以在其中看到 Object 此处的小摘要 我的 posts 数组的长度为 0 posts Array 0 然而 当我展开帖子
  • 使用 grunt js,如何监视 .coffee 文件的变化?

    我是 gruntjs 新手 这是我的简单 gruntfile global module false module exports function grunt Project configuration grunt initConfig
  • 画布中圆弧的不同 fillStyle 颜色

    我想这个问题的解决方案非常简单 如果这是非常明显的 请提前道歉 但我似乎无法弄清楚如何为两个不同的弧设置两个不同的 fillStyles 我只是想能够绘制不同的彩色圆圈 下面我介绍了我通常如何在画布中使用其他形状 绘图方法来完成此操作 但由
  • HTML / Javascript - 通过单击父行来展开和折叠表行(子行)

    我几天来一直在尝试解决一个问题 终于明白 如 果没有帮助 我将不会成功 我想做一件我们每天在互联网上看到的常见事情 能够单击表格行以显示更多详细信息 但这里的更多细节并不意味着文本块 而是指与父行具有相同形状的子行 以下是 HTML 表格的
  • VueJs 操作内联模板并重新初始化它

    这个问题类似于VueJS 在内联模板组件中重新编译 HTML https stackoverflow com questions 34087195 vuejs re compile html in an inline template co
  • VueJs 操作内联模板并重新初始化它

    这个问题类似于VueJS 在内联模板组件中重新编译 HTML https stackoverflow com questions 34087195 vuejs re compile html in an inline template co
  • 克隆元件查找器

    在研究可用的同时ElementFinder and ElementArrayFinder方法 我注意到有一个clone method http angular github io protractor api view ElementFin
  • 如何在 Safari 10 中查看 cookie?

    这些是我尝试过的方法 在 Safari 10 中查看 HTTP 标头 https stackoverflow com questions 39760367 view http headers in safari 10 但 cookie 没有
  • C# 反序列化根 JSON 未知密钥

    我有一个像这样的 JSON 必须反序列化它 0 foo id xyz bar id abc book 0 title hello author person x 1 title hi author person y 1 foo id xyz
  • C# 反序列化根 JSON 未知密钥

    我有一个像这样的 JSON 必须反序列化它 0 foo id xyz bar id abc book 0 title hello author person x 1 title hi author person y 1 foo id xyz

随机推荐