json_decode自己的类 - 警告:深度必须大于零

时间:2012-07-21 07:43:06

标签: php json

因为我更喜欢更面向对象的方法,所以我编写了自己的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 ]]] )

4 个答案:

答案 0 :(得分:2)

深度假设是一个数字而(int)null == 0因此你传递0为$ depth。从PHP手册512是$ depth http://php.net/manual/en/function.json-decode.php

的默认值

答案 1 :(得分:1)

Imho,面向对象的方法在这种情况下不值得发明自行车。例如。只需从Yii框架的CJSON::decode method获取源代码(或者那就是整个类非常优秀)。

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库会为你处理这个。