web-dev-qa-db-ja.com

PHPの単純なJSONリクエスト

私は次の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を返します、なぜですか?

ありがとう。

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

Jsonpではなくjsonが必要です。
配列を返したい場合は、json_decode($json, true)を使用することもできます。

28

_http://api.wipmania.com/jsonp?callback=jsonpCallback_でjsonpをリクエストすると、次のような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":"-"}}
_

コードの2番目のチャンクは、jsonpCallback()関数でjsonをラップしていません。

4
JKirchartz

明らかにこの状況では、正しいURLを使用してAPIにアクセスすると、純粋なjSONが返されます。

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

多くの人々が、OPの質問に答えるのではなく、使用中のAPIの代替を提供しているため、PHPでjSONpを処理する方法を探している人のためのソリューションを次に示します。

最初に、APIでコールバックメソッドを指定できるため、jSONサブ文字列を取得するJasperのメソッドを使用するか、json_decodeのコールバックメソッドを指定して、evalの呼び出しで使用する結果を変更できます。私はコピー猫になりたくないので、これはJasperのコード例の私の代替です。

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

var_dump($jsonfile);

確かに、これは少し長く、より安全ではなく、Jasperのコードほど読みにくいかもしれません。

$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'};
0
NeoVance

Webサイトは純粋なJSONを返さず、ラップされたJSONを返します。これはスクリプトとして含まれることを意図しており、コールバック関数を呼び出します。使用したい場合は、最初に関数呼び出し(最初の括弧と最後の括弧までの部分)を削除する必要があります。

0
dutchflyboy

サーバーがJSONPを実装している場合、コールバックパラメータはJSONP信号であると想定され、結果は次のようなJavaScript関数に似ています。

_jsonpCallback("{yada: 'yada yada'}")
_

そして、_json_decode_はjsonpCallback("{yada: 'yada yada'}")を有効なJSON文字列として解析できません

0
Felipe Sabino

JSONではなくJSONPが返されます。 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のソリューションの方が見栄えがよく、誤ったデータをいじるのではなく、正しいデータを要求するだけです。

0
Jasper

country_code(閉じ括弧とともにjsonに含まれているので、それらを削除します。これは有効なjson構文ではありません: json

0
grifos