php json_encode()以JavaScript JSON.parse无法解码的方式进行编码

时间:2015-04-18 17:54:44

标签: javascript php json

我正在尝试在PHP和Javascript之间工作,读取和编写包含json值的相同cookie,我在JS和PHP中读入数组。

如果我在我的php数组中保存使用json_encode()的cookie,我发现生成的cookie的内容都被编码,就像url编码一样。

问题在于,当我尝试读取该cookie并使用

解码JSON时
var existing_array = readCookie('cookie_name');
JSON.parse(existing_array)

我收到javascript错误(例如Uncaught SyntaxError:Unexpected token%)

如果我使用基于浏览器的cookie阅读器,我可以看到当通过javascript保存时,该数组很容易阅读: [" 644"" 636&#34]。

但是,当通过json_encode()函数在PHP中创建数组时,生成的内容最终会像:%5B%22644%22%5D。

如果没有发生这种编码,我确信JS功能可以解码它。还有其他人经历过这个吗?我在Windows 8和最新的Chrome浏览器上使用PHP 5.5。

2 个答案:

答案 0 :(得分:4)

需要在HTTP标头中填充Cookie,以便对其进行编码以进行传输:

setcookie('cookie_name', '["644","636"]');

...触发器:

Set-Cookie: cookie_name=%5B%22644%22%2C%22636%22%5D

...浏览器将其发回:

Cookie: cookie_name=%5B%22644%22%2C%22636%22%5D

你的readCookie()函数应该正确解码数据,但似乎没有。如果你想修复它,你可以从中获取一些想法。 jquery-cookie插件:

function parseCookieValue(s) {
    if (s.indexOf('"') === 0) {
        // This is a quoted cookie as according to RFC2068, unescape...
        s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
    }

    try {
        // Replace server-side written pluses with spaces.
        // If we can't decode the cookie, ignore it, it's unusable.
        // If we can't parse the cookie, ignore it, it's unusable.
        s = decodeURIComponent(s.replace(pluses, ' '));
        return config.json ? JSON.parse(s) : s;
    } catch(e) {}
}

请注意decodeURIComponent部分。

答案 1 :(得分:1)

谢谢@Evilzebra,它只是在解决它的JS的开头添加了decodeURIComponent。

decodeURIComponent(readCookie('cookie_name'));