1

因为我更喜欢面向对象的方法,所以我编写了自己的 json 类来处理 json_last_error 以进行解码和编码。

不知何故,我收到了 json_decode 方法的 depth 属性的 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

4 回答 4

2

深度假设是一个数字,(int)null == 0因此您将 0 传递给 $depth。来自 php 手册 512 是 $depth http://php.net/manual/en/function.json-decode.php的默认值

于 2012-07-21T07:49:18.630 回答
1

恕我直言,在这种情况下,面向对象的方法不值得发明自行车。例如,只需从 Yii 框架的CJSON::decode 方法中获取源代码(或者最好使用非常优秀的整个类)。

json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

您不能将 NULL 作为深度传递。所以你的 json_decode() 别名不正确。

于 2012-07-21T07:50:38.073 回答
1

Depth 是 json_decode 的递归深度(应该是 INTEGER)。有关详细信息,请参阅手册。

您正在做的是将 $depth 设置为 0。由于您的 json 对象的深度为 2。 $depth 的最小值必须为2. 此外,您的代码在任何深度>2 的值下都可以正常工作,但我建议使用默认值 512(最初是 128,后来在 PHP 5.3.0 中增加到 512)

另请注意,assoc它必须是一个bool值。

于 2012-07-21T07:53:51.810 回答
0

这不是您的函数的问题,并且如果未传入参数,则将其设置为 null 。问题是因为您将 null 传递给 json_decode 以获得深度。只需检查是否为空$assoc$depth如果它们不为空,请将它们适当地传递给 json_decode 。此外,您应该明确这$assoc是一个布尔值并使用默认值。

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

于 2012-07-21T07:56:27.223 回答