Подтвердить что ты не робот

Простой запрос JSON в PHP

У меня есть следующий json

country_code({"latitude":"45.9390","longitude":"24.9811","zoom":6,"address":{"city":"-","country":"Romania","country_code":"RO","region":"-"}})

и я хочу только country_code, как его разобрать?

У меня есть этот код

<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = file_get_contents($json);

var_dump(json_decode($jsonfile));
?>

и он возвращает NULL, почему?

Спасибо.

4b9b3361

Ответ 1

<?php
$jsonurl = "http://api.wipmania.com/json";
$json = file_get_contents($jsonurl);
var_dump(json_decode($json));
?>

Вам просто нужно json not jsonp.
Вы также можете попробовать использовать json_decode($json, true), если хотите вернуть массив.

Ответ 2

вы запрашиваете jsonp с http://api.wipmania.com/jsonp?callback=jsonpCallback, который возвращает функцию, содержащую JSON, например:

jsonpCallback({"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}})

а не сам JSON. измените свой URL на http://api.wipmania.com/json, чтобы вернуть чистый JSON, например:

{"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}}

Обратите внимание, что второй фрагмент кода не переносит json в функцию jsonpCallback().

Ответ 3

Веб-сайт не возвращает чистый JSON, а завершает JSON. Это означает, что он будет включен как script и вызовет функцию обратного вызова. Если вы хотите использовать его, вам сначала нужно удалить вызов функции (часть до первой парантезы и паратетез в конце).

Ответ 4

Если ваш сервер реализует JSONP, он будет считать, что параметр обратного вызова является сигналом JSONP, и результат будет похож на функцию JavaScript, например

jsonpCallback("{yada: 'yada yada'}")

И тогда json_decode не сможет разобрать jsonpCallback("{yada: 'yada yada'}") как допустимую строку JSON

Ответ 5

Вы возвращаетесь JSONP, а не JSON. JSONP предназначен для междоменных запросов в JavaScript. Вам не нужно использовать его при использовании PHP, потому что на него не влияют междоменные политики.

Поскольку вы получаете строку из функции file_get_contents(), вы можете заменить текст country_code( (это конкретная часть ответа JSONP):

<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = substr(file_get_contents($json)), 13, -1);

var_dump(json_decode($jsonfile));
?>

Примечание

Это работает, но решение JKirchartz выглядит лучше, просто запрашивайте правильные данные, а не вмешивайтесь в неправильные данные.

Ответ 6

Если country_code( вместе с закрывающей скобкой включаются в ваш json, удалите их. Это недействительный синтаксис json: json

Ответ 7

Очевидно, что в этой ситуации использование правильного URL-адреса для доступа к API возвращает чистый jSON.

"http://api.wipmania.com/json"

Многие люди предоставляют альтернативу используемому API, а не отвечают на вопрос OP, так что вот решение для тех, кто ищет способ обработки jSONp в PHP.

Во-первых, API позволяет вам указать метод обратного вызова, поэтому вы можете использовать Jasper-метод для получения подстроки jSON, или вы можете дать метод обратного вызова json_decode и изменить результат для использования с вызовом eval, Это моя альтернатива примеру Jasper, поскольку мне не нравится копировать cat:

$json = "http://api.wipmania.com/jsonp?callback=json_decode";
$jsonfile eval(str_replace("(", "('", str_replace(")", "')", file_get_contents($json)))));

var_dump($jsonfile);

По общему признанию, это кажется немного более продолжительным, более неуверенным и не столь ясным для чтения как код Джаспера:

$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = substr(file_get_contents($json)), 13, -1);

var_dump(json_decode($jsonfile));

Затем jSON "address":{"city":"-","country":"Romania","country_code":"RO","region":"-"} сообщает нам, что он имеет доступ к файлу country_code следующим образом:

$jsonfile->{'address'}->{'country_code'};