带双引号的json解析错误

问题描述 投票:47回答:8

即使转义为双引号也会抛出解析错误。 看下面的代码

//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将无法解析。我该如何处理这种情况?

php javascript json parsing double-quotes
8个回答
30
投票

好吧,最后,JSON的解析使用相同的eval,所以当你给他们smth时没有区别。语法不正确。在这种情况下,你必须在php中正确地转义你的引号,然后用json_encode转义它们和它们的转义斜杠

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

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

这应该适用于客户端JS(如果我没有拼写错误)。


34
投票

Javascript unescapes它的字符串和json unescapes他们也。 json解析器将第一个字符串('{"result": ["lunch", "\"Show\""] }')视为{"result": ["lunch", ""Show""] },因为javascript中的\"表示",但不会退出双引号字符串。

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

我认为,'{"result": ["lunch", "\\"Show\\""] }'也应该奏效。


11
投票

这个问题是由双折叠字符串转义机制引起的:一个来自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]);

10
投票

来自docs

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

json_encode()接受两个args,值和选项。所以试试吧

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

我没有试过这个。


3
投票

关闭php.ini中的magic_quotes_gpc


2
投票

php to javascript Object (php >= 5.3.0)

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

0
投票

如果添加标准C转义,那么JSON.parse会将像\"这样的序列转换为",将\\转换为\,将\n转换为换行符等。

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

在我们的项目中:

原始字符串""{\"lat\":28.4594965,\"lng\":77.0266383}""

在传递给JSON.parse()之后

"{"lat":28.4594965,"lng":77.0266383}"

第二次传球给JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

请注意,JSON.parse()删除了转义字符而不是将string转换为object

删除转义字符后,字符串到对象转换工作。

这是演示:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}

0
投票

这可能有所帮助:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
© www.soinside.com 2019 - 2024. All rights reserved.