json解析错误,带双引号
-
09-09-2019 - |
题
即使转义双引号也会引发解析错误。
看下面的代码
//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
将无法解析。我该如何处理这种情况?
解决方案
好了,终于,JSON的解析使用相同的eval,所以这时候,你给他们不便没有区别。用不正确的语法。在这种情况下,你必须正确地逃避你的报价在PHP中,然后逃离他们和他们的逃逸与json_encode斜杠
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo json_encode($json);
?>
OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"
此应于客户端JS工作(如果我做没有错字)。
其他提示
未逸出的Javascript其字符串和JSON反转义它们。
第一串('{"result": ["lunch", "\"Show\""] }'
)由JSON分析器所看到
{"result": ["lunch", ""Show""] }
,因为\"
在javascript装置"
,但不退出双引号的字符串。
在第二串'{"result": ["lunch", "\\\"Show\\\""] }'
获取第一非转义到{"result": ["lunch", "\"Show\""] }
(并且正确由JSON转义)。
我想,那应该'{"result": ["lunch", "\\"Show\\""] }'
工作太。
此问题是由双折的字符串转义机制引起的:一个来自JS和一个来自JSON
。反斜线字符与另一个字符以下组合的组合用于表示的一个字符强>不是在字符串中另有表示的。 '' \\ '' 代表 '\' 等
此逃逸机制发生JSON.parse()之前的工作原理。
例如,
var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"
从字符串发生器的角度来看,它的传递四个齿隙强> '\' 进入的JavaScript解释器。
从JavaScript解释器的角度来看,它inteprets的有两个齿隙强>(\)作为每个 '\\' 序列将被解释为一个 '\'。
从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]);
从文档
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);
我没有尝试这样做虽然。
关闭magic_quotes_gpc
中的的php.ini 强>
PHP来JavaScript对象(PHP> = 5.3.0)
var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');
如果添加标准 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}"
上 2ND 传递给 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);
}
这可能会帮助:
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));