JSON 为 foreach() 提供的参数无效


JSON Invalid argument supplied for foreach()

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

[{"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,但仍然没有结果,对此有什么想法吗?

提前致谢

您需要显式json_decode输出转换为数组。喜欢这个:

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

遇到了与您完全相同的问题,这解决了我的问题。

由于您的 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 = "网址.php";

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

我也遇到了这个错误,我已经用这个解决了它:

    $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/>";
    }

只需像这样删除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,则返回的对象将转换为关联数组。

请查看您在呼叫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 返回的对象将被转换为关联数组时,话虽如此,访问属性的方式将使用[]而不是->

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

<?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/>";
}
?>