我正在构建一个购物车,当按下“购买”按钮时,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 item
value 在字符串中有一个逗号,我将返回值保存到 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。