如果字符串包含单词undefined作为值,为什么php函数json_decode会失败?

时间:2011-05-31 08:53:16

标签: php javascript json dojo

我有这个字符串,它是由dojo.toJson()函数生成的:

{"page":"accommodation task=viewList","language":undefined}

当用php中的json_decode对其进行解码时,它返回null。

我已经发现这是由未定义的值引起的,但我不确定这是否是预期的,或者它是否是一个错误。上面的字符串是无效的json吗?为什么php不能将undefined转换为null?

我正在使用PHP 5.2.10

2 个答案:

答案 0 :(得分:8)

因为undefined无效JSON。 JSON没有undefined的JavaScript概念。它确实有null,它有点模糊,但通常的事情(无论好坏)只是省略值为undefined的属性。

如果Dojo的toJson产生无效的JSON,我会很惊讶。您可以考虑使用Crockford's JSON.stringify代替。如果Dojo的toJson真的这样做,我会把它作为一个错误报告给Dojo团队。

更新:显然有人did report it to them,他们在“垃圾进入垃圾”理论中将其关闭为无效。不是我的项目,但那只是我将如何处理undefined值的属性...我会省略它们或抛出异常。

更新2 :您可能知道,ECMAScript 5th edition specification定义了JSONparse对象,stringifyJSON.stringify哪些浏览器正在添加支持。规范的undefined定义表示undefined值未呈现”(第15.12.3节,注2) - 例如,应省略该属性。也许如果你指出Dojo团队,他们会重新考虑他们的GIGO对bug报告的回应。另请注意@ Felix的评论如下:它们省略了函数引用,它们也无法在JSON中有效表示,但对{{1}}应用了不同的规则。

更新3 :在Dojo 1.6.1中仍然存在问题。这是v1.6.0的live test,这是CDN上的最新版本。我也测试了v1.6.1,它仍然在那里打破了。 (不会发布测试页面链接到他们的下载部分,但是,这将是粗鲁的。)

答案 1 :(得分:0)

您可以在服务器端将PHP中的undefined转换为null,从而解决了当前问题:

<?php
$json = '{"page":"accommodation task=viewList","language":undefined,"example": "This is an example of an occurence of undefined that remains"}';
$json = preg_replace( 
     '~undefined(?=(?:[^"]*"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")*[^"]*$)~', 'null', $json 
);

var_dump( json_decode( $json ) );

更好的解决方案是确保'未定义'不会出现在JSON中,因为它确实是无效的。