Php 带双引号的json分析错误
即使已转义,双引号也会引发分析错误。Php 带双引号的json分析错误,php,javascript,json,parsing,double-quotes,Php,Javascript,Json,Parsing,Double Quotes,即使已转义,双引号也会引发分析错误。 请看下面的代码 //parse the json in javascript var testJson = '{"result": ["lunch", "\"Show\""] }'; var tags = JSON.parse(testJson); alert (tags.result[1]); 这是由于双引号(已转义)而引发的分析错误。 即使是eval()在这里也不起作用。 但如果我用这样的双斜杠来逃避它: var result = '{"r
请看下面的代码
//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\u encode()
函数用一个斜杠(如:\“show\”
)转义一个双引号,json.parse
将无法解析。如何处理这种情况?Javascript将取消对字符串的扫描,json也将取消对字符串的扫描。
json解析器将第一个字符串('{“result”:[“午餐”,“显示\']}
)视为
{“结果”:[“午餐”,“显示”]}
,因为在javascript中\“
表示”
,但不退出双引号字符串
第二个字符串“{”result:[“午餐”,“\\\”Show\\\\\”“]}
将第一个未替换为{”result:[“午餐”,“\\”Show\”“]}
(json正确地未替换)
我认为,“{”result:[“午餐”,“节目”\\\\\\\\”“]}”
也应该有效。来自
JSON\u HEX\u APOS
(整数)All'被转换为\u0027JSON“HEX”(整型)All”转换为\u0022
json_encode()接受两个参数,即值和选项。因此请尝试
json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);
不过我还没有尝试过这个方法。最后,JSON的解析使用相同的eval,所以当您使用不正确的语法给它们smth.时没有区别。在这种情况下,您必须在php中正确地转义引号,然后使用JSON_encode转义引号及其转义斜杠
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo json_encode($json);
?>
OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"
输出:“{\'result\':[\'sunch\',\'\\\\\'Show\\\\\']}”
这应该适用于客户端JS(如果我没有输入错误)。在php.ini中关闭magic\u quotes\u gpc
这个问题是由两个折叠字符串转义机制引起的:一个来自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]);
php到javascript对象(php>=5.3.0)
var-storesLocations=JSON.parse(“”);
如果添加了标准C转义符,那么JSON.parse
将把像\“
这样的序列转换成”
,\
转换成\
,\n
转换成换行符等
'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')
在我们的项目中:
原始字符串“{\”lat\”:28.4594965,“lng\”:77.0266383}”“
在传递到JSON.parse()之后
第二次传递到JSON.parse()
请注意,JSON.parse()
删除了转义字符,而不是将string
转换为object
删除转义字符后,字符串到对象的转换工作正常
以下是演示:
while (typeof p1 != 'object') {
p1 = JSON.parse(p1);
pass++;
console.log('On pass ', pass, p1);
}
这可能有助于:
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
试试这个。然后再试一次
<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>
但这是json_encode()函数应该注意的问题。为什么它返回的东西不能被json.parse()正确解析。这不是json_encode中的错误(我假设这就是你的意思).json_encode不是用来创建JavaScript字符串文本的,因此它不会进行额外的转义。正如文档所示,您使用的PHP版本早于5.3.0。这就是答案,但它应该是默认行为。这也是一个非常好的解决方法。它解决了我的问题。这是一个非常好的解决方案.
while (typeof p1 != 'object') {
p1 = JSON.parse(p1);
pass++;
console.log('On pass ', pass, p1);
}
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
<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>