我有这个字符串,它是由dojo.toJson()函数生成的:
{"page":"accommodation task=viewList","language":undefined}
当用php中的json_decode对其进行解码时,它返回null。
我已经发现这是由未定义的值引起的,但我不确定这是否是预期的,或者它是否是一个错误。上面的字符串是无效的json吗?为什么php不能将undefined转换为null?
我正在使用PHP 5.2.10
答案 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定义了JSON
个parse
对象,stringify
和JSON.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中,因为它确实是无效的。