Javascript:解析document.cookie JSON对象的问题

7
在服务器上,我将一个JSON对象作为cookie进行存储(使用Django / json.dumps),其样式如下:
'{"name": "Simon", "gender": "M"}'

在客户端运行 document.cookie 命令,可以看到 cookie 的内容,格式如下:
"user="{\"name\": \"Simon\"\054 \"gender\": \"M\"}";

我有一个小函数可以通过名称检索cookie ( getCookie('user') ),它返回一个字符串:
"{\"name\": \"Simon\"\054 \"gender\": \"M\"}"

我希望将其解析为JSON对象以便在客户端进一步使用,但是JSON.parse()返回错误:“SyntaxError:Unexpected number”。

奇怪的是,如果您运行以下内容:

JSON.parse("{\"name\": \"Simon\"\054 \"gender\": \"M\"}") 

如果直接在控制台中操作它能够正常工作。有什么想法吗?

如果有更好的方法来存储cookie等,我很开放地接受建议。

提前感谢您。


2
\054 在那里是做什么的? - John Dvorak
1
在Cookie中不能插入逗号,因为在Cookie逻辑中已经有分隔符了,所以应该先执行以下代码: '{\"name\": \"Simon\"\054 \"gender\": \"M\"}'.replace("\054",","); - Frogmouth
2个回答

10

\054破坏了你的json。它是一个编码过的,(逗号)。

这样写:

string.replace(/\\054/g, ',');

应该去做它。


当我尝试使用string.replace('\054', ',')时,\不会被替换,我得到的仍然是相同的字符串。 - sidarcy
反斜杠不应被替换,尝试使用双反斜杠 \\。 - Ori Refael
+1,因为你是正确的,\054 打破了 JSON,现在只需要弄清楚为什么我不能替换它:/ - sidarcy
我的错...为了方便提问,我只展示了JSON中的2个项目,实际上有很多数据。您的答案是正确的,但它只替换了单个\054实例。str.replace(/\054/g, ",")解决了问题,感谢您的帮助。 - sidarcy
我会把这个加到答案里 :) 很高兴能帮上忙。 - Cerbrus

8

逗号是Cookie中的非法字符之一,还有其他的非法字符。为了避免问题,您可以在将JSON放入cookie之前对其进行编码:

encodeURIComponent('{"name": "Simon", "gender": "M"}');
//return "%7B%22name%22%3A%20%22Simon%22%2C%20%22gender%22%3A%20%22M%22%7D"

decodeURIComponent('%7B%22name%22%3A%20%22Simon%22%2C%20%22gender%22%3A%20%22M%22%7D');
//return '{"name": "Simon", "gender": "M"}'

这篇答案更好地解释了cookie中“允许的字符”的世界:Cookies中允许的字符
希望这能对您有所帮助。 :)

2
+1 对于“允许的 cookie”信息,非常感谢。我希望在服务器上创建一些可以轻松解析为 JSON 的内容,在 Python 中这并不容易。 - sidarcy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接