J'ai le json suivant
country_code({"latitude":"45.9390","longitude":"24.9811","zoom":6,"address":{"city":"-","country":"Romania","country_code":"RO","region":"-"}})
et je veux juste le country_code, comment puis-je l'analyser?
J'ai ce code
<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = file_get_contents($json);
var_dump(json_decode($jsonfile));
?>
et il retourne NULL, pourquoi?
Merci.
<?php
$jsonurl = "http://api.wipmania.com/json";
$json = file_get_contents($jsonurl);
var_dump(json_decode($json));
?>
Vous avez juste besoin de json et non de jsonp.
Vous pouvez également essayer d'utiliser json_decode($json, true)
si vous souhaitez renvoyer le tableau.
vous demandez jsonp avec http://api.wipmania.com/jsonp?callback=jsonpCallback
, qui retourne une fonction contenant JSON comme:
jsonpCallback({"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}})
et non JSON lui-même. changez votre URL en http://api.wipmania.com/json
pour retourner du JSON pur comme:
{"latitude":"44.9718","longitude":"-113.3405","zoom":3,"address":{"city":"-","country":"United States","country_code":"US","region":"-"}}
notez que le deuxième morceau de code n'encapsule pas le json dans la fonction jsonpCallback()
.
Évidemment, dans cette situation, l'utilisation de l'URL correcte pour accéder à l'API retournera du jSON pur.
"http://api.wipmania.com/json"
Beaucoup de gens proposent une alternative à l'API utilisée, plutôt que de répondre à la question de l'OP, alors voici une solution pour ceux qui recherchent un moyen de gérer jSONp en PHP.
Tout d'abord, l'API vous permet de spécifier une méthode de rappel, vous pouvez donc utiliser la méthode de Jasper pour obtenir la sous-chaîne jSON, ou vous pouvez donner une méthode de rappel de json_decode et modifier le résultat à utiliser avec un appel à eval. C'est mon alternative à l'exemple de code de Jasper car je n'aime pas être un chat de copie:
$json = "http://api.wipmania.com/jsonp?callback=json_decode";
$jsonfile eval(str_replace("(", "('", str_replace(")", "')", file_get_contents($json)))));
var_dump($jsonfile);
Certes, cela semble un peu plus long, plus précaire et pas aussi clair à lire que le code de Jasper:
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback"; $jsonfile = substr(file_get_contents($json)), 13, -1); var_dump(json_decode($jsonfile));
Ensuite, le jSON "address":{"city":"-","country":"Romania","country_code":"RO","region":"-"}
nous dit d'accéder au country_code comme ceci:
$jsonfile->{'address'}->{'country_code'};
Le site Web ne renvoie pas du JSON pur, mais du JSON enveloppé. Ceci est censé être inclus en tant que script et appellera une fonction de rappel. Si vous voulez l'utiliser, vous devez d'abord supprimer l'appel de fonction (la partie jusqu'à la première paranthèse et la paranthèse à la fin).
Si votre serveur implémente JSONP
, il supposera que le paramètre de rappel est un signal JSONP
et le résultat sera similaire à une fonction JavaScript, comme
jsonpCallback("{yada: 'yada yada'}")
Et puis, json_decode
Ne pourra pas analyser jsonpCallback("{yada: 'yada yada'}")
comme une chaîne JSON valide
Vous êtes renvoyé JSONP, pas JSON. JSONP est pour les demandes inter-domaines en JavaScript. Vous n'avez pas besoin de l'utiliser lorsque vous utilisez PHP car vous n'êtes pas affecté par les politiques inter-domaines.
Puisque vous obtenez une chaîne de la fonction file_get_contents()
, vous pouvez remplacer la country_code(
texte (il s'agit de la partie spécifique JSONP de la réponse):
<?php
$json = "http://api.wipmania.com/jsonp?callback=jsonpCallback";
$jsonfile = substr(file_get_contents($json)), 13, -1);
var_dump(json_decode($jsonfile));
?>
Cela fonctionne, mais la solution de JKirchartz semble meilleure, il suffit de demander les données correctes plutôt que de jouer avec les données incorrectes.
Si country_code(
ainsi que les parenthèses fermantes sont inclus dans votre json, supprimez-les. Ce n'est pas une syntaxe json valide: json