在PHP中访问JSON值

时间:2014-02-22 15:22:25

标签: php json

{"coord":{"lon":73.69,"lat":17.8},"sys":{"message":0.109,"country":"IN","sunrise":1393032482,"sunset":1393074559},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}],"base":"cmc stations","main":{"temp":293.999,"temp_min":293.999,"temp_max":293.999,"pressure":962.38,"sea_level":1025.86,"grnd_level":962.38,"humidity":78},"wind":{"speed":1.15,"deg":275.503},"clouds":{"all":0},"dt":1393077388,"id":1264491,"name":"Mahabaleshwar","cod":200}

我试图从json上面的天气中获取描述但是在php中出错。我试过下面的PHP代码:

$jsonDecode = json_decode($contents, true);
$result=array();

foreach($jsonDecode as $data)
{

  foreach($data{'weather'} as $data2)
  {

     echo $data2{'description'};
  }

}

感谢任何帮助。我是使用json的新手。

6 个答案:

答案 0 :(得分:1)

您必须使用方括号([])来访问数组元素,而不是卷曲元素({})。

因此,应更改代码以反映这些更改:

foreach($data['weather'] as $data2)
{
    echo $data2['description'];
}

此外,您的外部foreach循环将导致您的代码执行与您想要的完全不同的操作,您应该这样做:

foreach($jsonDecode['weather'] as $data2)
{
    echo $data2['description'];
}

答案 1 :(得分:1)

你的$ jsonDecode似乎是一个数组,所以这应该有效 -

foreach($jsonDecode['weather'] as $data)
{
    echo $data['description'];
}

答案 2 :(得分:1)

您可以直接使用范围访问数据

$json = '{"coord":{"lon":73.69,"lat":17.8},"sys":{"message":0.109,"country":"IN","sunrise":1393032482,"sunset":1393074559},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}],"base":"cmc stations","main":{"temp":293.999,"temp_min":293.999,"temp_max":293.999,"pressure":962.38,"sea_level":1025.86,"grnd_level":962.38,"humidity":78},"wind":{"speed":1.15,"deg":275.503},"clouds":{"all":0},"dt":1393077388,"id":1264491,"name":"Mahabaleshwar","cod":200}';
$jsonDecode = json_decode($json, true);

echo $jsonDecode['weather'][0]['description'];
//output Sky is Clear

正如你所看到的,wheater`被范围所包围,这意味着它是另一个数组。如果您有多个结果,则可以循环抛出该数组

foreach($jsonDecode['weather'] as $weather)
{
     echo $weather['description'];
}

Live demo

答案 3 :(得分:0)

您必须使用“[]”运算符

访问“weather” 像这样,

$data["weather"]

答案 4 :(得分:0)

如果decode的结果是数组,请使用:

$data['weather']

如果结果是对象,请使用:

$data->weather

答案 5 :(得分:0)

在你的问题中有几件值得回答的事情:

问:json_decode($data)json_decode($data, true)之间的区别是什么? 答:前者将JSON对象转换为PHP对象,后者创建了一个关联数组:http://uk1.php.net/json_decode

在任何一种情况下,迭代结果都没有意义。您可能只想访问“天气”字段:

$o = json_decode($data) =>使用$weather = $o->weather
$a = json_decode($data, true) =>使用$weather = $a['weather']

一旦你有'天气'字段,仔细看看它是什么: "weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01n"}]

这是一个包含单个对象的数组。这意味着您需要迭代它,或使用$clearSky = $weather[0]。在这种情况下,你选择哪种json_decode方法无关紧要=> JSON数组总是被解码为PHP(数字索引)数组。

但是,一旦你得到$clearSky,你正在访问该对象并且它再次重要,你选择哪种方法 - 使用箭头或括号,类似于第一步。

因此,获取天气描述的正确方法可能是:

json_decode($data)->weather[0]->description
json_decode($data, true)['weather'][0]['description']

注意:在后一种情况下,仅在PHP 5.4或更高版本中支持取消引用函数调用的结果。在PHP 5.3或更早版本中,您必须创建一个变量。

注意:我还建议您始终使用isset检查结果中是否实际设置了预期字段。否则,您将尝试访问未定义的字段,这会引发错误。