【问题标题】:JSON Invalid argument supplied for foreach()为 foreach() 提供的 JSON 参数无效
【发布时间】:2015-01-09 02:40:11
【问题描述】:

我在从 JSON 中检索数据时遇到一些问题,它总是说 为 foreach() 提供的参数无效,这是 url.php 中的 JSON:

[{"nama":"IT SERVICE & SOLUTION","nilai":0,"periode":"11","tahun":"2014"},{"nama":"SUBDIV BUSINESS SERVICE","nilai":0,"periode":"11","tahun":"2014"},{"nama":"Data Analytics","nilai":100.1446,"periode":"11","tahun":"2014"}]

这是我的代码:

<?php
$url="url.php";
$json = file_get_contents($url);
$koyim=  json_decode($json,true);
foreach($koyim as $data){
    echo $data->nilai;
    echo $data->nama;
    echo "<br/>";
}
?>

我一直在尝试不同的方法来检索 json,但仍然没有结果,对此有什么想法吗?

提前致谢

【问题讨论】:

  • var_dump($koyim) 显示什么?
  • 它显示 string() "jsondata"
  • url.php 没有返回您认为的 JSON。
  • 我从jsonlint.com检查,它是一个有效的json
  • 它是真的显示string() "jsondata",还是你的意思是string() "[{"nama":...}]"

标签: php arrays json


【解决方案1】:

您需要将json_decode 输出显式转换为数组。像这样:

$koyim = (array)json_decode($json);

我遇到了和你一样的问题,这解决了我的问题。

【讨论】:

    【解决方案2】:

    由于您的 JSON 是有效的,下一步是检查解码中的 PHP 错误。

    在解码 JSON 时首先尝试使用此代码检查错误:

    <?php
        $url="url.php";
        $json = file_get_contents($url);
        $koyim=  json_decode($json,true);
    
        // Add this switch to your code
        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;
    }
    // end of switch
    
    foreach($koyim as $data){
    echo $data['nilai'];
    echo $data['nama'];
    echo "<br/>";
    }
    ?>
    

    一旦您知道错误,您可以从 CONSTANT 搜索更精确的错误以防万一。最喜欢它的“JSON_ERROR_UTF8”。

    为此,您可以尝试以下代码: $url = "url.php";

    $json = file_get_contents($url);
    $json = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($json));
    
    $koyim = json_decode($json,true);
    

    【讨论】:

      【解决方案3】:

      我也有这个错误,我已经用这个解决了:

          $koyim = (array)json_decode($json, true);
      

      所以,你的代码应该是这样的:

          $url = "url.php";
          $json = file_get_contents($url);
          $koyim = (array)json_decode($json, true);
          foreach($koyim as $data) {
              echo $data['nilai'];
              echo $data['nama'];
              echo "<br/>";
          }
      

      【讨论】:

        【解决方案4】:

        只需像这样删除json_decode() 中的true:

        $koyim=  json_decode($json);
        

        输出:

        0 IT SERVICE & SOLUTION
        0 SUBDIV BUSINESS SERVICE
        100.1446 Data Analytics
        

        因为如果您查看手册:http://php.net/manual/en/function.json-decode.php

        并从那里引用:

        关联 当为 TRUE 时,返回的对象将被转换为关联数组。

        【讨论】:

        • 这改变了{...} 的解码方式,但他的问题在于[...],它总是返回一个数组。
        • 您在更改之前是否收到了foreach 错误?
        • 此更改修复了他从$data-&gt;nilai 收到的错误。
        • @Rezaakhmadg 它对我来说很好用!你确定你改了吗?
        • @Rizier123 他的问题是 JSON 不是数组的正确 JSON。这不是他在问题中发布的内容。
        【解决方案5】:

        当您调用 json_decode 时,请查看您设置为 true 的 assoc 标志: http://php.net/manual/en/function.json-decode.php

        assoc
        When TRUE, returned objects will be converted into associative arrays.
        

        当 assoc 标志设置为 true 时,返回的对象将被转换为关联数组,也就是说,您访问属性的方式将是使用 [] 而不是 -&gt;

        使用下面的代码应该可以正常工作:

        <?php
        $url="url.php";
        $json = file_get_contents($url);
        $koyim=  json_decode($json,true);
        foreach($koyim as $data){
            echo $data['nilai'];
            echo $data['nama'];
            echo "<br/>";
        }
        ?>
        

        【讨论】:

        • 这回答了一个不同的问题。查看我对 Rizier123 的回答的 cmets。
        猜你喜欢
        • 1970-01-01
        • 2011-05-17
        • 2011-02-07
        相关资源
        最近更新 更多