PHP JSON解析器 vs Javascript JSON解析器

3
我有一个通过PHP serialize进行json_encode的数组:
json_encode(array('pattern' => '^(?:/?site/(?[\w\-]+))?(?:/?intl/(?[a-z]{2}(?:\-[a-z]{2})?)/?)?(/?(?.*))'));
// output json: {"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}

我尝试在Javascript中解码:

JSON.parse('{"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}');

那我不明白为什么会出现错误"Uncaught SyntaxError: Unexpected token w"? PHP和Javascript的JSON解析器有什么区别吗?

1个回答

4
问题出在你使用了JSON.parse()并用单引号括起你的JSON字符串。
因此,你转义的正则表达式字符串在外部字符串文字(单引号)的解释中被取消转义,然后在字符串pattern的值(双引号)的解释中混淆,最终导致JavaScript试图解析"\w"时出现错误。
以下示例,模仿PHP直接呈现JSON声明,可以在JS控制台中正常运行:
var json = {"pattern":"^(?:\/?site\/(?[\\w\\-]+))?(?:\/?intl\/(?[a-z]{2}(?:\\-[a-z]{2})?)\/?)?(\/?(?.*))"}

如果您想使用JSON.parse,请先在PHP中双重转义您的JSON字符串

$json = json_encode(array('pattern' => '^(?:/?site/(?[\w\-]+))?(?:/?intl/(?[a-z]{2}(?:\-[a-z]{2})?)/?)?(/?(?.*))'));
$json = str_replace('\', '\\', $json);
// output json: {"pattern":"^(?:\\/?site\\/(?[\\\\w\\\\-]+))?(?:\\/?intl\\/(?[a-z]{2}(?:\\\\-[a-z]{2})?)\\/?)?(\\/?(?.*))"}

然后,在JS中:
var json = JSON.parse('{"pattern":"^(?:\\/?site\\/(?[\\\\w\\\\-]+))?(?:\\/?intl\\/(?[a-z]{2}(?:\\\\-[a-z]{2})?)\\/?)?(\\/?(?.*))"}')

需要注意的是,这只有在将JSON作为文字直接输入到JS程序中时才是必要的。如果JSON通过网络传输并由JS以这种方式进行处理,则不需要执行此操作。 - Barmar

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