使用带引号的JSON.parse字符串

16

我有这个:

JSON.parse('{"130.00000001":{"p_cod":"130.00000001","value":"130.00000001 HDD Upgrade to 2x 250GB HDD 2.5\" SATA2 7200rpm"}}');

JSONLint 表示这是合法的 JSON。但在执行时我遇到了一个 JSON.parse 错误。

然而,如果我将代码更改为:

    JSON.parse('{"130.00000001":{"p_cod":"130.00000001","value":"130.00000001 HDD Upgrade to 2x 250GB HDD 2.5\\" SATA2 7200rpm"}}');

(注意双反斜杠)

它可以工作,但现在JSONLint说invalid json

有人能帮助理解这种行为吗?


2
对我来说看起来很简单。Jsonlint有问题 ;) - Wolph
那个输入字符串是从哪里来的?它是由JSON编码器生成的吗? - paullb
@paullb 不是,它来自于 PHP 的 $_POST 变量。 - mjsilva
@paullb,我表述不够清楚,它来自于一个 JS 对象的 JSON.stringify。 - mjsilva
如果您使用另一个库,例如 http://www.openjs.com/scripts/data/json_encode.php ,会发生什么? - paullb
1
你为什么要在字符串字面量上调用 JSON.parse,而不是将 JSON 文本作为普通对象字面量包含进去呢? - Matthew Crumley
1个回答

20

这是线路格式和您在代码中编写以获取线路格式之间的区别。 当您在代码中声明此内容时,需要在文字字面量中使用双反斜杠,以便字符串得到单个反斜杠(否则它将解释 \" 为仅声明 " 的转义序列并将其放入字符串)。 如果您打印文字字面量的值,您将看到一个单反斜杠。


谢谢Dean,我想我首先得转义JavaScript,然后再转义JSON。假设这是来自PHP的内容,那么我该如何进行“双重”转义呢?我已经尝试过这个:str_replace('"','\"', $json),但它没有起作用。 - mjsilva
11
明白了:str_replace('\"','\\\"', $json)今天我学到了还有一个转义地狱 :) - mjsilva

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