无法使用file_get_contents读取JSON

时间:2016-04-29 08:27:25

标签: php arrays json

我从这里得到空(空白页):

api.php代码:

$json_data = array(
    'status' => 'failed',
    'version' => '0.0.5'
);
header("Content-type: application/json");
echo json_encode($json_data, JSON_PRETTY_PRINT);

getapi.php代码:

$json_file = file_get_contents("http://domain.com/api.php");
$json_data = json_decode($json_file);
print_r($json_data);



    $json_file = file_get_contents("http://domain.com/api.php");
echo $json_file; //{"status":"failed","version":"0.0.5"}
    $json_data = json_decode($json_file);
    print_r($json_data); // blank page

4 个答案:

答案 0 :(得分:2)

问题可能在于您的PHP.ini文件和PHP设置不允许您访问远程URL。

您要查找的设置为allow_url_fopen

你有两种方法可以绕过它而不用改变php.ini,其中一种是使用fsockopen(),另一种是使用cURL。

如果您可以访问php.ini文件,我建议您进行编辑。

一些阅读

Documentation on allow_url_fopen

答案 1 :(得分:1)

我想提交的另一个答案是尝试调试你的json字符串,因为你已经告诉我们你的file_get_contents()

正确地提取了内容

我在json_last_error()

上的PHP.net文档中有以下脚本
echo 'Decoding: ' . $string;
json_decode($json_file);

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 PHP_EOL;

修改

看起来你的角色设置有问题。尝试强制utf-8如下。

更改:

header("Content-type: application/json");

要:

header('Content-Type: application/json; charset=utf-8');

答案 2 :(得分:0)

首先,您应该确保您的api.php可以通过HTTP获得。 在某些浏览器中打开URL http://domain.com/api.php进行检查,您必须看到可用的响应。 如果您仍然看到空白页面,那么可能您的网络服务器未正确配置或api.php文件存储在非公共文件夹中。 public_html或web。 运行以下命令:

 $ php -i|grep 'allow_url_fopen'
 allow_url_fopen => On => On

另外请检查您的PHP配置,选项allow-url-fopen应设置为true。 另请注意自PHP 5.4.0起可用的常量JSON_PRETTY_PRINT

下一个代码段将帮助您排除故障,将其置于脚本的顶部,但不要忘记在以下情况后将其删除:

error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('display_startup_errors', true);

答案 3 :(得分:0)

尝试使用上面的函数而不是json_decode,它包含内部的utf8修复

function parseJson($content, $options = true)
{
    $content = fixUtf8String(trim($content));

    $decoded = json_decode(utf8_decode($content), $options);

    if (($jsonLastErr = json_last_error()) != JSON_ERROR_NONE) {
        switch ($jsonLastErr) {
            case JSON_ERROR_DEPTH:
                throw new Exception('JSON Decoding failed: Maximum stack depth exceeded');
            case JSON_ERROR_CTRL_CHAR:
                throw new Exception('JSON Decoding failed: Unexpected control character found');
            case JSON_ERROR_SYNTAX:
                throw new Exception('JSON Decoding failed: Syntax error');
            default:
                throw new Exception('JSON Decoding failed');
        }
    }

    return $decoded;
}

function fixUtf8String($s)
{
    if (empty($s)) {
        return $s;
    }
    $s = preg_match_all(
        "#[\x09\x0A\x0D\x20-\x7E]|
        [\xC2-\xDF][\x80-\xBF]|
        \xE0[\xA0-\xBF][\x80-\xBF]|
        [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|
        \xED[\x80-\x9F][\x80-\xBF]#x", $s, $m
    );

    return implode("", $m[0]);

}