因为我更喜欢更面向对象的方法,所以我编写了自己的json类来处理json_last_error以进行解码和编码。
不知怎的,我得到了json_decode方法的深度属性的php警告。
json_decode方法的PHP核心api(eclipse PDT)如下所示:
function json_decode ($json, $assoc = null, $depth = null) {}
到目前为止一切顺利,但如果我像这样编写自己的课程:
function my_json_decode ($json, $assoc = null, $depth = null) {
return json_decode($json, $assoc, $depth);
}
并尝试按以下方式运行:
$json = '{ "sample" : "json" }';
var_dump( my_json_decode($json) );
我收到以下警告:
Warning: json_decode(): Depth must be greater than zero in /
我错过了什么吗?我想如果我将属性的null传递给一个将属性本身设置为null的方法,它应该没问题?!
使用:服务器:Apache / 2.2.22(Unix)PHP / 5.3.10
感谢您的帮助!
[编辑]澄清我的理解漏洞在哪里:
我正在使用Eclipse Indigo + PDT。 org.eclipse.php.core.language的PDT PHP核心api与php.net关于json_decode的说法不同:
json_decode org.eclipse.php.core.language:
json_decode ($json, $assoc = null, $depth = null)
json_decode php.net:
json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
答案 0 :(得分:2)
深度假设是一个数字而(int)null == 0
因此你传递0为$ depth。从PHP手册512是$ depth http://php.net/manual/en/function.json-decode.php
答案 1 :(得分:1)
json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
您不能将NULL作为深度传递。所以你的json_decode()的别名不正确。
答案 2 :(得分:1)
深度是json_decode的递归深度(应该是INTEGER)。有关详细信息,请参阅manual。
您正在做的是将$ depth设置为0.由于您的json对象的深度为2. $ depth的最小值必须为2
。你的代码也适用于任何深度> 2的值,但我建议使用默认值512(最初为128,后来在PHP 5.3.0中增加到512)
另请注意,assoc
必须是bool
值。
答案 3 :(得分:0)
这不是你的函数的问题,如果没有传入,则将参数设置为null。问题是因为你将null传递给json_decode以获得深度。只需检查$assoc
和$depth
是否为空,如果它们不为null,则将它们适当地传递给json_decode。此外,您应该明确$assoc
是一个bool并使用默认值。
function my_json_decode ($json, $assoc = false, $depth = null) {
if ($assoc && !$depth)
return json_decode($json, $assoc);
else if ($depth)
return json_decode($json, $assoc, $depth);
return json_decode($json);
}
但是,我不确定为什么你需要这样做,因为php-json库会为你处理这个。