私は次の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を返します、なぜですか?
ありがとう。
_<?php
$jsonurl = "http://api.wipmania.com/json";
$json = file_get_contents($jsonurl);
var_dump(json_decode($json));
?>
_
Jsonpではなくjsonが必要です。
配列を返したい場合は、json_decode($json, true)
を使用することもできます。
_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をラップしていません。
明らかにこの状況では、正しい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'};
Webサイトは純粋なJSONを返さず、ラップされたJSONを返します。これはスクリプトとして含まれることを意図しており、コールバック関数を呼び出します。使用したい場合は、最初に関数呼び出し(最初の括弧と最後の括弧までの部分)を削除する必要があります。
サーバーがJSONP
を実装している場合、コールバックパラメータはJSONP
信号であると想定され、結果は次のようなJavaScript関数に似ています。
_jsonpCallback("{yada: 'yada yada'}")
_
そして、_json_decode
_はjsonpCallback("{yada: 'yada yada'}")
を有効なJSON文字列として解析できません
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のソリューションの方が見栄えがよく、誤ったデータをいじるのではなく、正しいデータを要求するだけです。
country_code(
閉じ括弧とともにjsonに含まれているので、それらを削除します。これは有効なjson構文ではありません: json