2009-06-04 123 views
42

即使转义出现双引号也会引发解析错误。
看看下面的代码json用双引号解析错误

//parse the json in javascript 
var testJson = '{"result": ["lunch", "\"Show\""] }'; 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 

这是因为抛双引号(已经转义)的语法错误。
即使eval()也不会在这里工作。
但是,如果我用双斜线逃脱这样的:

var result = '{"result": ["lunch", "\\"Show\\""] }'; 
var tags = JSON.parse(result); 
alert (tags.result[1]); 

然后正常工作。
为什么我们需要在JavaScript中使用双斜线? 问题是,PHP json_encode()函数使用单斜杠(如:\"show\")转义双引号,JSON.parse将无法​​解析。我如何处理这种情况?

+1

变种的eval( '(' +导致+ ')'); – Priya 2011-12-29 07:44:24

回答

29

那么,最后,JSON的解析使用相同的eval,所以当你给他们不明显的时候没有区别。语法不正确。在这种情况下,你必须正确地逃避PHP的报价,然后逃离他们和他们的逃逸与json_encode

<?php 
    $json = '{"result": ["lunch", "\"Show\""] }'; 
    echo json_encode($json); 
?> 

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }" 

这应该在客户端的JS工作(如果我做了没有错别字)斜杠。

33

Javascript unescapes其字符串和json unescapes他们以及。 由json解析器看到的第一个字符串('{"result": ["lunch", "\"Show\""] }')为 {"result": ["lunch", ""Show""] },因为\"在JavaScript中表示",但不会退出双引号字符串。

第二个字符串'{"result": ["lunch", "\\\"Show\\\""] }'首先取消转义为{"result": ["lunch", "\"Show\""] }(并且json正确转义)。

我认为,那'{"result": ["lunch", "\\"Show\\""] }'也应该工作。

+5

+1这实际上是正确的答案 – Christian 2011-01-28 23:31:04

8

docs

JSON_HEX_APOS(整数)所有'被转换为\ u0027
JSON_HEX_QUOT(整数)的所有“被转换为\ u0022

json_encode()有两个参数,价值和选择。所以试试

json_encode($result, JSON_HEX_QUOT); // or 
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS); 

我还没有t尽管如此。

+1

警告:json_encode()期望只有1个参数,2中给出... – 2011-07-17 04:49:08

+1

您正在使用PHP版本早于5.3.0,然后如文档所示。 – raylu 2011-07-20 23:36:56

+0

这就是答案,但它应该是以 – nus 2012-07-18 09:43:15

2

关闭magic_quotes_gpcphp.ini

10

此问题是由双折叠字符串转义机制引起的:一个来自JS,一个来自JSON。

将反斜杠字符与另一个后续字符组合的组合用于表示一个字符,该字符在字符串中不可表示。 ''\\''代表'\'等。

这个转义机制发生在JSON.parse()工作之前。

例如

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}'); 
console.log(parsedObj.sentence); 
>>>"It is one backslash(\)" 

从字符串发生器的角度来看,它传递四个齿隙 '\' 进入的JavaScript解释器。

从JavaScript解释器的角度来看,它解释了有两个反斜杠(\),因为每个'\'序列将被解释为一个'\'。

从JSON解析器的角度来看,它收到两个反斜杠(\\),JSON字符串转义规则会将其解析为一个单独的'\',即输出结果。

解释你第一代码:

var testJson = '{"result": ["lunch", "\"Show\""] }'; 
//The real string after sequence escaping in to JS is 
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse. 
//Thus, it breaks the JSON grammar and generates an error 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 
1

PHP来JavaScript对象(PHP> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');