Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP的JSON_编码创建的JSON会导致解析错误_Php_Json - Fatal编程技术网

使用PHP的JSON_编码创建的JSON会导致解析错误

使用PHP的JSON_编码创建的JSON会导致解析错误,php,json,Php,Json,以以下PHP数组为例: $arr = array( 'about' => 'Ai você fala o seguinte: "- Mas vocês acabaram isso?" Vou te falar: -"Não, está em andamento!" Tem obras que "vai" durar pra depois de 2010. Agora, por isso, nós já não desenhamos, não começamos a fazer pr

以以下PHP数组为例:

$arr = array(
    'about' => 'Ai você fala o seguinte: "- Mas vocês acabaram isso?" Vou te falar: -"Não, está em andamento!" Tem obras que "vai" durar pra depois de 2010. Agora, por isso, nós já não desenhamos, não começamos a fazer projeto do que nós "podêmo fazê"? 11, 12, 13, 14...',
    'construction' => 100,
);
当使用PHP的JSON_encode解析为JSON时,我得到以下字符串:

[{"about": "Ai você fala o seguinte: \"- Mas vocês acabaram isso?\" Vou te falar: -\"Não, está em andamento!\" Tem obras que \"vai\" durar pra depois de 2010. Agora, por isso, nós já não desenhamos, não começamos a fazer projeto do que nós \"podêmo fazê\"? 11, 12, 13, 14...", "construction": 100}]
请注意,原始字符串中的双引号用反斜杠转义。它看起来很好,很均匀

当我尝试使用JSON.parse在Chrome或Safari中解析JSON时,控制台中出现以下错误:

未捕获的语法错误:意外数字

Firefox给了我:

SyntaxError:JSON.parse:JSON数据第1行第39列的对象中的属性值后面应该有“,”或“}”

从Firefox错误中,我收集到字符串中的第一个转义双引号似乎破坏了代码

如果我在引号之前手动转义反斜杠,我会得到预期的对象

如何防止此错误?我做错什么了吗

相关代码:

型号: 控制器: 视图:
你没有做错什么。事实上,你自己已经找到了解决方案!PHP生成的字符串可能是通过使用类似于

var jsvar='<?= json_encode($arr) ?>';
当JavaScript解析此字符串时,将“吃掉”前面的\并且将由JSON.parse解析的JSON字符串如下所示:

'{"about":"Ai você fala o seguinte: "- Mas vocês acabaram isso?" Vou te falar: -"Não, está em andamento!" Tem obras que "vai" durar pra depois de 2010. Agora, por isso, nós já não desenhamos, não começamos a fazer projeto do que nós "podêmo fazê"? 11, 12, 13, 14...","construction":100}'
这个字符串将导致错误消息,这是可以理解的

解决方案:

因此,您必须使用addslashes屏蔽所有\项:

或者,正如@JAAulde非常正确地发布的那样:您可以通过直接执行以下操作,完全跳过变量的“字符串”状态:

var o=<?= json_encode($arr)) ?>;

因为JSON使用JS文本语法的一个子集,所以直接将其回显到JS上下文中不需要任何引号包装或解析

输出方式如下:

var enterprises = <?php echo $json; ?>;

FWIW,您最初的错误是由于需要在JS字符串文本中使用双转义斜杠造成的。因为输出为字符串文字,所以单个\在JavaScript执行中被吃掉,不再用于JSON解析。要输出为JS字符串文字,首先需要转义。因此,您应该坚持我上面的更改,更不用说我推荐的更改需要更少的开销。

显示您的js代码。如果上面的json字符串进行了验证,那么其他东西正在破坏它。添加了相关的代码片段。如果您需要其他东西,请告诉我。json已经是有效的javascript,所以您只需要使用var foo=;。不需要转储到“字符串”中,然后单独解析。但是,由于字符串已损坏,它仍然会以其他方式损坏-您是否确认到处都有正确的字符集?e、 g.如果您在say-win-1252字符集环境中构建json,然后将其转储到utf-8页面中,您将得到损坏的字符。@MarcB:您是对的。删除单引号是可行的,但问题仍然存在。对我在任何地方都使用UTF-8。你能运行JSON.parse“[{about:Ai vocèfala o seguinte:\-Mas vocès acabaram isso?\Vou te falar:-\Não,estáem and mento!\Tem obras que\vai\durar pra depois de de de 2010.Agora,por isso,Nós jáNèN desenhamos,Nèamos a fazer do que Nós\podèmo fazè11,12,13,14…,建筑:100]”吗;在你的控制台里?如果您遇到相同的错误,我们可以排除编码问题。这是因为您的json已损坏。json是有效的javascript。如果json字符串有效,那么var foo=[{..}];完全可以接受/有效的javascript。这是不正确的。PHP的json_编码生成一个字符串。我需要在字符串周围加引号,以便JS理解它是一个字符串。不添加引号会产生一个未捕获的语法错误:意外的标记o错误。@Alexandreiffjanini您对所涉及的机制有一个基本的误解。试试我说的,你会明白的。从PHP输出到浏览器的所有数据都是一个字符串,它被传递到各种上下文中。你不能仅仅因为输出的HTML是PHP中的字符串就用引号括起来。。。。另外,请注意对已接受答案的编辑它确实有用!
var jsvar='<?= json_encode($arr) ?>';
var js_var='[{"about": "Ai você fala o seguinte: \"- Mas vocês acabaram isso?\" Vou te falar: -\"Não, está em andamento!\" Tem obras que \"vai\" durar pra depois de 2010. Agora, por isso, nós já não desenhamos, não começamos a fazer projeto do que nós \"podêmo fazê\"? 11, 12, 13, 14...", "construction": 100}]';
'{"about":"Ai você fala o seguinte: "- Mas vocês acabaram isso?" Vou te falar: -"Não, está em andamento!" Tem obras que "vai" durar pra depois de 2010. Agora, por isso, nós já não desenhamos, não começamos a fazer projeto do que nós "podêmo fazê"? 11, 12, 13, 14...","construction":100}'
var jsvar='<?= addslashes(json_encode($arr)) ?>';
var o=JSON.parse(jsvar);
var o=<?= json_encode($arr)) ?>;
var enterprises = <?php echo $json; ?>;
enterprises = JSON.parse(enterprises);