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

Javascript 当字符串值包含逗号时,Safari中的JSON.parse失败,javascript,jquery,json,safari,Javascript,Jquery,Json,Safari,我正在构建一个购物车,当按下“购买”按钮时,一个web服务返回一个JSON输出,然后将其作为字符串保存到Javascript cookie中 web服务的典型返回可能是: { "d":{ "58658":{ "id":"58658", "qty":"1", "singlePrice":"754", "salePrice":"754", "isBulk":"0", "isS

我正在构建一个购物车,当按下“购买”按钮时,一个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
      }       
   }
}
当我稍后试图回忆它时:

var shopping_cart = cookies.get('shopping_cart');
shopping_cart = JSON.parse(shopping_cart);
它在每个浏览器中都能正常工作,甚至很明显,在Internet Explorer中也能正常工作。。。除了狩猎

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

错误是:

JSON parse error, unterminated string.
正如我所说,这似乎只是Safari中的一个问题,但我很难找到解决方案

非常感谢您的帮助

编辑:

我创造了一把小提琴: 这个Fiddle将复制这个问题,它涉及到将数据作为字符串存储在Cookie中,并将其重新解析为JSON


但是,由于我已将我的Cookie函数作为外部资源()包含在内,因此您需要确保Safari不会阻止第三方Cookie。

您不需要解析此json。。。 尝试:

var a={
“d”:{
"58658":{
“id”:“58658”,
“数量”:“1”,
“单一价格”:“754”,
“售价”:“754”,
“isBulk”:“0”,
“isSor”:“0”,
“增值税”:“20.00”,
“masterCat”:“6”,
“imgUrl”:http://...img 网址“,
“单重”:“18000”,
“totalAvailableStock”:“2”,
“第三方库存”:“,

“项目”:“Electrovoice Live X Elx115p,每个”//好的,现在我们已经找到了实际问题的根源,我想我可以提供帮助

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

这反过来意味着它被视为cookie的结尾,这意味着当您重新加载它时,它在该点被截断

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

请参阅,并注意逗号、双引号、分号等都是cookie的相关字符

另见:

至于为什么它会出现在Safari而不是其他浏览器中……我想这可能和其他浏览器一样都要归功于运气。也许其他浏览器的cookie解析器认识到逗号后面的以下字符串无效,从而确定逗号不是用作分隔符的

您可能还希望看到包含示例JS库库的代码,它确实完成了所有正确的转义。您可能想考虑使用这个LIB代替当前的代码(或至少部分)

。 希望有帮助

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


如果您使用的是大型Cookie,那么有其他方法来存储本地数据,而这些方法不受此问题的影响。可能对您有所帮助。

不,逗号不是问题所在。您可以提供一个JSFIDLE示例来演示此问题吗?作为记录,我让您的JSON字符串在使用JSFIDLE的Safari中正常工作……请参阅onl我改变的是删除了
/@Spudley,谢谢。我也能让它与那把小提琴一起工作,但是,我已经扩展了小提琴来使用我的
cookies
函数,现在,事实上,出现了一个不同的错误!暗示cookies不起作用,但它们在其他所有东西上都起作用了!好的,我想现在我们有了你的小提琴code我们已经到了问题的核心。基本上,它归结为逃逸。但更多信息请参见我的答案。我知道我不想直接使用它,但如果我想将它保存在Cookie中,我会这样做?如果你发布一个fiddleFiddle,这将是gr8-你必须停止Safari阻止第三方脚本,使fiddle工作,但它在这里:非常好。谢谢…现在做了两个很好的修改,使用localStorage似乎更有意义,我已经修改了我的Cookie函数,在可能的情况下使用localStorage,或者在不使用的情况下回滚到Cookie。在我的Cookie中添加escape也会后退
var shopping_cart = cookies.get('shopping_cart');
shopping_cart = JSON.parse(shopping_cart);
JSON parse error, unterminated string.
var a= {
    "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
        }
    }
}

console.log(a.d['58658'])