Intereting Posts
Как проверить, действительны ли имена таблиц в Propel? Предупреждение: ldap_start_tls () : невозможно запустить TLS: сервер недоступен Лак: как отдельно кешировать страницы на основе значения определенного файла cookie Рассчитать возраст, основанный на дате рождения Хранение важных секретных ключей в php-файлах Определение внешних ключей Laravel с фабриками моделей, от одного до одного и от одного до многих отношений без создания ненужных моделей Извлечение расстояния от функции FacetWP Proximity для отображения в шаблоне WordPress Кодирование строки как UTF-8 с спецификацией в PHP PHP json_decode для ключа с не-буквенно-цифровым символом Twitch API – не может получить токен аутентификации с помощью PHP Как сделать запрос на обновление с параметрами и оператором CASE в Laravel 4 PHP-код для исключения index.php с помощью glob экономия места в таблице Mysql PHP LDAP Получить информацию о пользователе члена, который является членом группы (403) Доступ не настраивается при добавлении события в календарь

Разбор JSON-объекта в PHP с помощью json_decode

Я попытался запросить погоду из веб-службы, предоставляющей данные в формате 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", ... }, ... ] } } } 

Это, похоже, работает:

 $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. Это упрощает работу.

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

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

TRUE возвращает массив вместо объекта.

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

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

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

NB – два негатива делают положительным. 🙂

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

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

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

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

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

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