PHP解码JSON - 空输出

时间:2014-10-06 04:07:52

标签: php json

我可能整天都在努力解决这个问题。我已经在堆栈上阅读了多个问题,并且一直在阅读文章和检查文档,但我似乎无法弄清楚为什么这批代码只产生一个空输出。我错过了括号,说错了吗,等等?

<?php
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial";
$str = file_get_contents($url);
$json = json_decode($str);
$temp =  $json['main']['temp_min'];
$content = $temp;


$array = array(
     "content" => $content,
      refresh_requency => 30

);


echo json_encode($array);
?>

我要问的是,有人可以指出我或告诉我我做错了什么。我的服务器是不是正确处理数据?这可能是一种可能性。

我尝试过的另一件事就是打印出$temp和/或其他变量,例如$str。当我这样做,虽然他们甚至没有出现,所以我认为我的问题只是不知道如何解决它。

更新

我得出结论,这是我的网络托管服务。就像我添加var_dump($json)一样,我得到一个空输出null输出。

如果我运行error_reporting(E_ALL); ini_set('display_errors', 1);,也要确认它是我的webhost,它指向不允许传出连接的文件php.ini。我在我的本地主服务器(raspberry pi)上编辑了相同的文件,运行相同的文件,它工作正常。

5 个答案:

答案 0 :(得分:1)

像这样访问$ temp

$temp =  $json->main->temp_min;

您将获得所需的输出。

此外,您需要在allow_url_fopen配置文件中允许php.ini。有些主机出于安全原因不允许这样做

答案 1 :(得分:1)

以下是上述代码的工作解决方案:

<?php
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial";
$str = file_get_contents($url);
$json = json_decode($str, true);
$temp =  $json['main']['temp_min'];
$content = $temp;


$array = array(
     "content" => $content,
      "refresh_requency" => 30

);


echo json_encode($array);
?>

当我执行您的代码时,我在您的代码段中发现了2个问题:

1)您试图使用stdClass类型的对象作为数组。

解决方案:

<?php
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial";
$str = file_get_contents($url);
$json = json_decode($str);
$temp =  $json->main->temp_min;
$content = $temp;


$array = array(
     "content" => $content,
      "refresh_requency" => 30

);


echo json_encode($array);
?>

2)您没有将数组键放入引号:

$array = array(
     "content" => $content,
      refresh_requency => 30

);

应该是:

$array = array(
     "content" => $content,
      "refresh_requency" => 30

);

答案 2 :(得分:0)

$json = json_decode($str, true);

您需要第二个参数将json字符串转换为关联数组而不是对象。而你正在尝试使用数组($json['main']['temp_min']),而不是对象。还

$array = array(
     "content" => $content,
     "refresh_requency" => 30
);

代码看起来像

<?php
$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial";
$str = file_get_contents($url);
$json = json_decode($str, true);
$content = $json['main']['temp_min'];

$array = array(
 "content" => $content,
 "refresh_requency" => 30
);

echo json_encode($array);

结果是http://codepad.viper-7.com/euBNAk

{"content":44.6,"refresh_requency":30}

答案 3 :(得分:0)

json_decode()的第二个参数是assoc(associative)。默认情况下为0.当它为0(默认值)时,json_decode()将返回一个对象,而不是一个数组。这就是你无法使用$ json ['main'] ['temp_min']访问temp_min的原因;

但是如果使用值1作为第二个参数,该函数将返回一个数组。参数1表示将关联设置为1(真)。所以使用$ json = json_decode($ str,true);而不是$ json = json_decode($ str);.您将能够使用$ json ['main'] ['temp_min']访问;现在

你也忘记了第13行的双引号(refresh_requency)。祝好运。

<?php

$url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial";
$str = file_get_contents($url);
$json = json_decode($str, true);

$temp =  $json['main']['temp_min'];
$content = $temp;


$array = array(
    "content" => $content,
    "refresh_requency" => 30
);

echo json_encode($array);

答案 4 :(得分:0)

只想要帮助

我改变了你的代码,这是正确的

<?php
    $url = "http://api.openweathermap.org/data/2.5/weather?id=4879890&units=imperial";
    $str = file_get_contents($url);
    $json = json_decode($str, TRUE);    // Wrong here
    $temp =  $json['main']['temp_min'];
    $content = $temp;

    $array = array(
       "content" => $content,
       "refresh_requency" => 30         // And wrong here, it's must string
    );

    echo json_encode($array);
 ?>

有关json在php中解码为数组或对象http://php.net/manual/en/function.json-decode.php

的更多信息