在PHP中从远程URL读取JSON

10

我有一个JSON文件:

http://www.jeewanaryal.com/angryQuiz/eighties/json/eighties.json

我正在尝试在PHP中解码它,方法如下:

$json = file_get_contents('http://www.jeewanaryal.com/angryQuiz/eighties/json/eighties.json'); 
$data = json_decode($json);
var_dump($data);

但是,我得到的输出是NULL。我有什么遗漏吗?


从 $data,输出为 NULL。 - jeewan
我该如何输出整个JSON数据? - jeewan
你的第一行代码是否有效?var_dump($json);会输出什么内容? - jeroen
我现在只是尝试那三行代码,我的意思是我没有循环遍历JSON数据。只有这三行PHP代码,但我得到了NULL :-( - jeewan
(Windows记事本问题)请参考此链接,我也分享了这个问题并解决了它:https://dev59.com/y2kv5IYBdhLWcg3w4kl2 - Felix Aballi
4个回答

8

使用来自PHP.NET json_last_error()的示例,我发现您的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;
}

输出:

 - Syntax error, malformed JSON

然而,我在下列网站检查您的json代码,但它显示为有效:


注意:以上网站均可检测您的json代码是否有效。

是的,你说得对。我在我的JSON文件中使用了一个新的换行符\n,可能导致了问题。但是,在线的JSON验证很好,它不是一个有效的PHP解码器。 - jeewan

5

文档

json_decode 可以像文档中所述,返回NULL

将 json 中的值转换为适当的 PHP 类型。 true、false 和 null(不区分大小写)会分别被转换为相应的 PHP 值 TRUE、FALSE 和 NULL。如果无法解码 JSON 数据或编码数据深度超过递归限制,则返回 NULL。

问题

json_decodeid 6内部出现\n时失败了。

{ "id": 6, "url": "http://jeewanaryal.com/angryQuiz/eighties/images/betterOffDead.jpg", "question": "在电影'Better Off Dead'中,Lane 的弟弟叫什么名字?", "answer": [ { "a": { "text": "Bradger", "status": 1 } }, { "b": { "text": "Peter", "status": 0 } }, { "c": { "text": "Frank", "status": 0 } }, { "d": { "text": "Michael", "status": 0 } } ] }

解决方案

我想你最好在json_decode之前对它们进行转义。

$safe_json = str_replace("\n", "\\n", $json);


但我不知道为什么会得到 NULL,这是有效的 JSON。 - jeewan
哇,太棒了,谢谢。但我只是在想它是否是一个有效的JSON。我使用\n来获取新行。难道它不应该工作吗? - jeewan
逃脱它们?我已经将其添加到答案中。 - Rawkode
嘿Rawkode,我尝试了不带任何换行符的不同JSON。我尝试了这个http://jeewanaryal.com/phpTest/jsonTest.json,但仍然显示为NULL :-(。看起来\n不是问题所在。 - jeewan
不,对我来说解码没问题。移除你的\n,你会发现它可以工作。如果它对你仍然是NULL,那么请按照@jeroen的建议检查你的php.ini文件。 - Rawkode
好的,谢谢。我会检查一下。 - jeewan

0
请将第二个参数设置为true。这将给您一个关联数组。如果结果仍为空,我会想知道file_get_contents是否返回了任何内容。

我尝试了你的代码,仍然是NULL :-( - jeewan

0

这只是一个猜测,但由于您没有展示$json包含什么内容,我假设file_get_contents返回了false,导致了您得到的结果。

您应该检查您的php.ini文件,allow_url_fopen的值是多少?如果是0,那意味着您无法从http地址读取文件,这可能是问题所在。

如果是这个问题,只需将allow_url_fopen的值更改为1即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接