Разбор JSON-объекта в PHP с использованием json_decode - PullRequest
38 голосов
/ 27 октября 2010

Я попытался запросить погоду у веб-службы, предоставляющей данные в формате JSON. Мой код запроса PHP, который не был выполнен, был:

$url="http://www.worldweatheronline.com/feed/weather.ashx?q=schruns,austria&format=json&num_of_days=5&key=8f2d1ea151085304102710";
$json = file_get_contents($url);
$data = json_decode($json, TRUE);
echo $data[0]->weather->weatherIconUrl[0]->value;    

Это некоторые данные, которые были возвращены. Некоторые детали были сокращены для краткости, но целостность объекта сохраняется:

{ "data": 
    { "current_condition": 
        [ { "cloudcover": "31",
            ... } ],  
      "request": 
        [ { "query": "Schruns, Austria",
            "type": "City" } ],
      "weather": 
        [ { "date": "2010-10-27",
            "precipMM": "0.0",
            "tempMaxC": "3",
            "tempMaxF": "38",
            "tempMinC": "-13",
            "tempMinF": "9",
            "weatherCode": "113",
            "weatherDesc": [ {"value": "Sunny" } ],
            "weatherIconUrl": [ {"value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" } ],
            "winddir16Point": "N",
            "winddirDegree": "356",
            "winddirection": "N",
            "windspeedKmph": "5",
            "windspeedMiles": "3" }, 
          { "date": "2010-10-28",
            ... },

          ... ]
        }
    }
}

Ответы [ 7 ]

61 голосов
/ 27 октября 2010

Похоже, это работает:

$url = 'http://www.worldweatheronline.com/feed/weather.ashx?q=schruns,austria&format=json&num_of_days=5&key=8f2d1ea151085304102710%22';
$content = file_get_contents($url);
$json = json_decode($content, true);

foreach($json['data']['weather'] as $item) {
    print $item['date'];
    print ' - ';
    print $item['weatherDesc'][0]['value'];
    print ' - ';
    print '<img src="' . $item['weatherIconUrl'][0]['value'] . '" border="0" alt="" />';
    print '<br>';
}

Если вы установите второй параметр json_decode в true, вы получите массив, поэтому вы не сможете использовать синтаксис ->.Я бы также предложил вам установить расширение JSONview Firefox , чтобы вы могли просматривать сгенерированные документы json в хорошем отформатированном древовидном представлении, аналогично тому, как Firefox отображает структуры XML.Это делает вещи намного проще.

49 голосов
/ 27 октября 2010

Если вместо этого используется следующее:

$json = file_get_contents($url);
$data = json_decode($json, TRUE);

ИСТИНА возвращает массив вместо объекта.

22 голосов
/ 27 октября 2010

Попробуйте этот пример

$json = '{"foo-bar": 12345}';

$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345

http://php.net/manual/en/function.json-decode.php

Примечание: два негатива дают положительный результат.:)

4 голосов
/ 27 октября 2010

Похоже, вы забыли ["значение"] или ->value:

echo $data[0]->weather->weatherIconUrl[0]->value;
0 голосов
/ 08 июня 2019

Когда вы выполняете декодирование json, вынудите его вернуть массив вместо объекта.

$data = json_decode($json, TRUE); -> // TRUE

Это вернет массив, и вы сможете получить доступ к значениям, задав ключи.

0 голосов
/ 14 мая 2013

При редактировании кода (из-за легкого ОКР) я заметил, что погода тоже есть в списке. Вы, вероятно, должны рассмотреть что-то вроде

echo $data[0]->weather[0]->weatherIconUrl[0]->value;

, чтобы убедиться, что вы используете weatherIconUrl для правильного экземпляра даты.

0 голосов
/ 21 августа 2012

Сначала убедитесь, что ваш сервер разрешает удаленное подключение, чтобы функция file_get_contents($url) работала нормально, большинство серверов отключают эту функцию по соображениям безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...