53

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

//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 中使用双斜杠?问题是 PHPjson_encode()函数用一个斜杠(像这样:)转义了一个双引号,\"show\"JSON.parse将无法解析。我该如何处理这种情况?

4

9 回答 9

35

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

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

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

于 2009-06-04T10:11:46.993 回答
33

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

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

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

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

于 2009-06-04T10:20:30.253 回答
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]);
于 2011-10-26T15:09:56.693 回答
10

文档

JSON_HEX_APOS (整数)所有 ' 转换为 \
JSON_HEX_QUOTu0027 (整数)所有 " 转换为 \u0022

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

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

我还没有尝试过这个。

于 2009-06-04T10:14:19.407 回答
8

php 到 javascript 对象 (php >= 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');
于 2014-09-02T11:26:23.973 回答
3

magic_quotes_gpcphp.ini中关闭。

于 2010-04-22T08:53:45.167 回答
0

如果添加了标准 C 转义符,则将转换为 into 、into 、换行等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}"

在第 2传递给JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

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

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

这是演示:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}
于 2018-04-25T08:16:56.470 回答
0

这可能会有所帮助:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
于 2019-03-29T17:13:04.257 回答
0

试试这个。然后尝试评论

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<pre><?php ($_POST)?print_r($_POST):'' ?></pre>

<form method="POST">
    <input type="text" name="name"><br>
    <input type="email" name="email"><br>
    <input type="time" name="time"><br>
    <input type="date" name="date"><br>
    <input type="hidden" name="id"><br>
    <textarea name="detail"></textarea>
    <input type="submit" value="Submit"><br>
</form>
<?php 
/* data */
$data = [
            'name'=>'vinay"'."'\\\\",
            'email'=>'imvsrajput@demo.demo',
            'time'=>date('H:i:00'),
            'date'=>date('Y-m-d'),
            'detail'=>'Try this var_dump(0=="ZERO") \\ \\"'." ' \\\\    ",
            'id'=>123,
        ];
?>
<span style="display: none;" class="ajax-data"><?=json_encode($data)?></span>
<script type="text/javascript">
    /* Error */
    // var json = JSON.parse('<?=json_encode($data)?>');
    /* Error solved */
    var json = JSON.parse($('.ajax-data').html());
    console.log(json)
    /* automatically assigned value by name attr */
    for(x in json){
        $('[name="'+x+'"]').val(json[x]);
    }
</script>
于 2020-05-12T13:14:08.743 回答