带双引号的json解析错误

Var*_*run 47 javascript php parsing json double-quotes

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

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

由于双引号(已经转义),这会抛出解析错误.
甚至eval()不会在这里工作.
但是如果我用这样的双斜线来逃避它:

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

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

cub*_*ube 34

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

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

我认为,这也'{"result": ["lunch", "\\"Show\\""] }'应该有效.


Jet*_*Jet 30

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

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

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是json_encode中的错误(我假设这就是你的意思).json_encode不是为了创建JavaScript字符串文字,因此它不会进行额外的转义. (7认同)
  • 但这是json_encode()函数应注意的事情。为什么返回JSON.parse()无法正确解析的内容。 (2认同)

ste*_*ang 11

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

反斜杠字符与另一个后续字符的组合用于表示字符串中无法表示的一个字符.''\'''代表'\'等.

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

例如,

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

从字符串生成器的角度来看,它将四个反斜杠 "\" 传递给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]);
Run Code Online (Sandbox Code Playgroud)


Óla*_*age 10

来自文档

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);
Run Code Online (Sandbox Code Playgroud)

我没有试过这个.


val*_*lir 8

php 到 javascript 对象 (php >= 5.3.0)

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