2013-07-12 13 views
6

phpのjson_decode関数で 'jsonp'リクエストを解析中に問題が発生しました。PHP: 'JSONP'の出力対 'JSON'の処理とその解析?

私の質問は

です。 「jsonp」でコールバック関数を使用するのはどういう意味ですか、それだけでは、どういう意味で使うのでしょうか? ?

b。 「jsonp」形式で受け取った構文エラーを修正するにはどうすればよいですか?

以下は、私が取得したコードと応答を示しています。

1.私はその後、私は私が推測する理由は、エラー・ノー4の意味JSON_SYNTAX_ERRORをスローしない受信した出力を、json_decodeしようとPHPのカール

$url = 'https://ssl.domain.com/data/4564/d.jsonp'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url);     
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);   
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");  
$feed = curl_exec($ch); 
curl_close($ch); 

echo $feed = gzdecode($feed); // Success its displays the jsonp feed 

2.とサンプルのURLをリクエストjsonpの文字列型の名前は引用符で囲まれていないからです。例えばCategoriesNamePositionなど

$json_feed = json_decode($feed); 
$error = json_last_error(); 
echo $error;  // Throws error no. 4 

3. RAW 'JSONP' URLからの出力。

domain_jsonp_callback({ 
    Categories:[ 
     { 
     Name:"Artifacts", 
     Position:14, 
     Count:70, 
     ImageUrls:{ 
      i100:"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png", 
      i120:"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png", 
      i140:"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png", 
      i180:"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png", 
      i220:"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png", 
      i280:"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png" 
     } 
     } 
    ] 
}); 
+1

回答を確認してください:http://stackoverflow.com/a/5081588/1788516 – Perry

+0

@Perry、ありがとう私はその答えを見ましたが、応答するサーバーがコールバック機能を送信する何らかの理由があります。そのコールバック関数は何らかの目的に適している必要がありますか? –

答えて

2

で、それを使用します、または私は何らかの方法でそれを使用すると思います。 ?

JSON-Pは実際には引数を持つ関数呼び出しからなるJavaScriptスクリプトです。

PHPで解析したい場合は、それを削除する必要があります。また、最後に);を取り除く必要があります。

b。 'jsonp'形式で受け取った構文エラーを修正するにはどうすればよいですか?

本当にJSONになるようにデータを修正する必要があります。あなたが持っているデータはJavaScriptのリテラルですが、JSONと一致するJavaScriptのサブセットには適合しません(たとえば、プロパティ名は文字列ではありませんが、そうでなければならないなど)。

代わりに、実際のJSONリソースフォームをソースとして取得する方がよいでしょう。

+0

これは何かを明らかにするとあなたに知らせるものです。 –

1

ないことについて確認が、私は名前もこのように引用されるべきだと思う:

domain_jsonp_callback({ 
    Categories:[ 
     { 
     "Name":"Artifacts", 
     "Position":14, 
     "Count":70, 
     "ImageUrls":{ 
      "i100":"//s3-eu-west-1.amazonaws.com/s.domain.com/1.png", 
      "i120":"//s3-eu-west-1.amazonaws.com/s.domain.com/2.png", 
      "i140":"//s3-eu-west-1.amazonaws.com/s.domain.com/3.png", 
      "i180":"//s3-eu-west-1.amazonaws.com/s.domain.com/4.png", 
      "i220":"//s3-eu-west-1.amazonaws.com/s.domain.com/5.png", 
      "i280":"//s3-eu-west-1.amazonaws.com/s.domain.com/6.png" 
     } 
     } 
    ] 
}); 

PS:あまりにも多分 "カテゴリー":?

+0

私はそれが残念なことに応答しているサーバーによって気になると思った。それはいくつかのPHP関数で管理することができる方法はありますか? –

+0

まあ...生のデータは文字列として来て、間違っているようですが、他の文字列のように編集することができます。 (これを行うより良い方法があるはずです) ":"で展開して一行目を読み込み、最初の要素を引用符で囲み、それを別の文字列に書き換えてみてください。有効なJSON ... –

+0

ありがとう最後の手段としてそれを試してみましょう。ユーザーがページをリクエストするたびに処理するのは面倒です。 –

2

コールバック関数は、JS呼び出しのためのもので、同じ発信元ポリシーを意識することなく、APIをAJAX方式で使用することができます。 JSONP呼び出しをJSブラウザで使用すると、コールバック関数がAPIクライアント側で定義される必要があります。

PHPコールバック関数内でJSONPを使用する場合、関数はまったく必要ありません。サーバは、生のJSONタイプの呼び出しをサポートしている場合 - コールバック関数の文字列を削除されていない場合、私はちょうどそれをオフにトリップしなければならない、「JSONP」でコールバック関数を使用することである何あなたのケース

$jsonData = json_decode(substr($feed, 22, -2)); 
関連する問題