在JSON编码中使用深度的目的是什么?

Gia*_*mPy 8 php json

我有这个示例代码:

$array = array(

    'GiamPy' => array(
            'Age' => '18',      
            'Password' => array(
                    'password' => '1234',
                    'salt' => 'abcd',
                    'hash' => 'whirlpool'
            ),  
        'Something' => 'Else'
    )

);

echo json_encode($array, JSON_PRETTY_PRINT);
Run Code Online (Sandbox Code Playgroud)

我在PHP文档中看到,自PHP 5.5.0(最近),json_encode允许一个新的参数,这是深度.

  1. 它的目的是什么?
  2. 我为什么需要它?
  3. 为什么在PHP 5.5.0中添加它?

dec*_*eze 9

该选项限制将要处理的深度(d'uh).数组的深度是通过嵌套的深度来衡量的.这是深度1的数组:

array(
    'foo',
    'bar',
    'baz'
)
Run Code Online (Sandbox Code Playgroud)

这是一个深度数组2:

array(
    array(
        'foo'
    ),
    array(
        'bar'
    ),
    array(
        'baz'
    )
)

// ------ depth ------>
Run Code Online (Sandbox Code Playgroud)

如果输入超过最大深度(默认为512),json_encode则只返回false.

为什么你可能会使用它是有争议的,你可能想要保护自己免受无意的无限递归或太多的资源使用.深度超过512级的数组可能具有无限递归引用,无法序列化.但是,如果您确定您的数组不是无限递归但是深度超过512,您可能希望明确地增加此限制.您可能还希望将限制降低为简单的错误捕获器; 假设您希望结果具有最大深度,但您的输入数据可能有些不可预测.

  • 确切地说,您可能*永远*不会拥有深度为 512 的数组,因此这是一个非常安全的默认上限。我猜这一直是`json_encode` 用来防止无限递归的内部限制。在 5.5 中,此参数已简单地向您公开,您现在可以根据需要更改它。可能有人遇到了这个限制并需要增加它。如果您真的对这个参数现在出现的原因感兴趣,请查阅 PHP 源代码提交历史。 (2认同)
  • 似乎这是产生更改的票证:https://bugs.php.net/bug.php?id=62369 (2认同)