【问题标题】:PHP: json decode limitsPHP:json解码限制
【发布时间】:2017-11-08 00:53:47
【问题描述】:

获取此代码:

$json = file_get_contents($this->url, true); 
$decode = json_decode($json, true); 

foreach ($decode as $key => $value) {
 ...
}

很简单,嗯?

传递一个包含多达 500 个数组元素的 $json.... 工作正常!

超过该限制...错误是:

警告:为 foreach() 提供的参数无效 /c/website/retriever/WsGlassRetriever.php 第 19 行

该函数的参数是否存在内存限制?

我在文档中没有找到任何关于它的信息。我的版本是 PHP 5.2.17-rnx1.1 和 Suhosin-Patch 0.9.7 (cli)

【问题讨论】:

  • var_dump($decode) 带给你什么?
  • 我不认为它的极限。它没有限制。试试var_dump($decode)看类型
  • 这可能不是因为元素的数量,而是因为无法解码的特定元素。在 php 5.3 中有 json_last_error() 函数。还要注意深度限制(默认为 512)
  • 你可以使用json_last_error() [edit: requires PHP >= 5.3!] 来确定到底出了什么问题:php.net/manual/en/function.json-last-error.php
  • @Darhazer 512 现在是 128,之前是 20。如果你的 pre-5.2.3 这可能是一个真正的问题,但 OP 是 5.2.17 所以他是128.

标签: php json


【解决方案1】:

如果 JSON 语法有错误,json_decode 返回 NULL。我刚刚成功地测试了一个包含 1000 个元素的数组,它运行得很好。

仔细检查您的 JSON 格式是否正确。即使是使用单引号而不是双引号,或者忘记将属性名称放在引号中,或者使用 32-127 范围之外的字符而不正确地以 UTF-8 进行编码,也会导致这些问题。

【讨论】:

  • 好的。这是一个格式错误的 utf-8 错误。我查看了我的 json,在那里我发现了一个 'ì' char,它是不好的 utf8...用 php 即时验证我的 utf-8 json 怎么样?
  • 我使用 GuzzleHttp 的 json_decode 包装器,当 JSON 数据错误时会抛出 InvalidArgumentException
【解决方案2】:

我确定你的 JSON 代码超过 500 有格式问题,使用了超过 20,000 个值的 JSON 这里是一个简单的 2000 数组脚本

$string = "Sample String Data ¶";
$string = preg_replace( '/[^[:print:]]/', '',$string); // remove all values that can affect JSON 
$array = array();
for($i = 0 ; $i <  2000; $i++)
{
    if(mt_rand(0, 1))
    {
        $array[] = $string ;
    }
    else
    {
        $array[] = array($string,1,$string) ;
    }
}   

$json =  json_encode($array);
$decodeArray =  json_decode($json);

switch (json_last_error()) {
    case JSON_ERROR_NONE:
        echo ' - No errors';
        break;
    case JSON_ERROR_DEPTH:
        echo ' - Maximum stack depth exceeded';
        break;
    case JSON_ERROR_STATE_MISMATCH:
        echo ' - Underflow or the modes mismatch';
        break;
    case JSON_ERROR_CTRL_CHAR:
        echo ' - Unexpected control character found';
        break;
    case JSON_ERROR_SYNTAX:
        echo ' - Syntax error, malformed JSON';
        break;
    case JSON_ERROR_UTF8:
        echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
        break;
    default:
        echo ' - Unknown error';
        break;
}

echo "<br />" ;


foreach ($decodeArray as $key => $value) {
    print_r($value) ;
    flush();
}

编辑 2

我很想知道是否有任何限制.. 刚刚用 250,000(250,000 个值,它工作正常)对其进行了测试

谢谢 奥莱库

【讨论】:

    【解决方案3】:

    就我而言,JSON 是正确的。我的问题是导致错误“超出最大堆栈深度”的“JSON_BIGINT_AS_STRING”参数。

    $jsonResult = json_decode($expr,true,JSON_BIGINT_AS_STRING);
    

    我删除了“JSON_BIGINT_AS_STRING”参数,错误消失了:

    $jsonResult = json_decode($expr,true);
    

    【讨论】:

    • 您的问题可能是您使用 JSON_BIGINT_AS_STRING 定义了最大深度,它等于 2。您应该这样做 $jsonResult = json_decode($expr, true, 512, JSON_BIGINT_AS_STRING);
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多