getJSONで受け取れるよう出力するには?

このQ&Aのポイント
  • 質問文章からセンセーショナルなタイトルを30文字前後で生成します。
  • $.getJSONを使用してAPIからデータを取得する方法について説明します。
  • 質問者が$.getJSONの第1引数を変更してデータを取得しようとしたが成功しなかった理由を解説します。
回答を見る
  • ベストアンサー

getJSONで受け取れるよう出力するには?

■前提 ・$.getJSONでAPIからデータ取得するサンプルがあります ・この時、第1引数のURLを叩くと、データが表示されます $.getJSON('http://hoge … &callback=?') .error( ajaxError ) .success(function( data ){ ・動作確認のため、「第1引数のURLで表示されたデータ」を取得(コピペ)して、「piyo.php」としてアップロードしてみました ■質問 ・$.getJSON第1引数を「piyo.php」へ変更すると、同じようにデータ取得できると思ったのですが、うまくいきません ・何故でしょうか? ・「json値」をサーバが返すようにすれば良いのでしょうか? ・それはどうやるのでしょうか? ・「echo json_encode?」「header('Content-Type:?」それとも、拡張子がjsonじゃないといけないのでしょうか?

  • re97
  • お礼率80% (601/744)
  • AJAX
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.3

No.2です。 > 戻り値として必ず「jsonデータ」を返す ということはあり得ません。返却されているのは、あくまで「json書式のテキスト」です。 そもそも、Webサーバは「.html」なり「.gif」なり、拡張子が登録されている要求URLの場合、自動でContent-typeを付加します。ところが、「.php」のような拡張子は、戻す内容が不明なため、(サーバの種類にもよると思いますが)デフォルト動作でtext/htmlなどのContent-typeを返します。 $.getJSONが、「どうせ戻りはJSONなのだからどんなCOntent-typeが来ても無視」と設計されればそう動作するわけで、事実、初期のjQueryは$.ajaxに"json"の指定がなく、textで受けてjson.parse()するような処理がまかり通っていましたがら、明確な基準はないのです。 ただ、サーバサイドから考えたら、相手は(ひょっとして前はContent-type不要で決め打ちだった?)$.getJSONだけではなく、$.getも$.ajaxもアリで、しかもjQueryなんか勝手にバージョンがどんどん上がっていくし、他にprototype.jsなんかもあり、正しくContent-typwを返すのが鉄則です。

re97
質問者

お礼

回答ありがとうございました。 >戻り値として必ず「jsonデータ」を返すということはあり得ません >自動でContent-typeを付加します >正しくContent-typwを返すのが鉄則です ・詳細な説明ありがとうございました ・おかげで疑問が解決しました ・大変参考になりましたー

その他の回答 (2)

  • shockatz
  • ベストアンサー率80% (153/191)
回答No.2

$.getJSON()メソッドは、戻り値としてjsonデータを期待するため、形式が「json文字列」であることと、Content-typeが正しくセットされている必要があります。 あと。文字コードはutf-8にしないと日本語などは文字化けします。 よって、 header("Content-Type: application/json; charset=utf-8"); が必要かと。

re97
質問者

補足

回答ありがとうございます >$.getJSON()メソッドは、戻り値としてjsonデータを期待するため、形式が「json文字列」であることと、Content-typeが正しくセットされている必要があります ・「Content-type」について教えてください ・例えば、戻り値として必ず「jsonデータ」を返す場合も、Content-typeは必須なのでしょうか? ・仮に形式が正しい「json文字列」だったとしても、「Content-type」未指定、あるいは、指定内容違いの場合には、正常動作しないのでしょうか? ・また、上記については、$.getJSON()以外だと、また別な挙動なのでしょうか?

  • pa_cotta
  • ベストアンサー率43% (25/58)
回答No.1

PHP側でjson_encode関数でjson形式に変換した値を返す(echoする)ようにすればいいです

re97
質問者

お礼

回答ありがとうございましたー

関連するQ&A

  • $.getJSONにJSON.stringifyを

    $.getJSONに、JSON.stringifyした結果を指定したいのですが、どうすればよいでしょうか? ■現状 ・コンソールにJSONは出力されているのですが、$.getJSONでこのファイルを指定しても、画面真っ白です ▼index.html <script type="text/javascript" src="hoge.json"></script> <script type="text/javascript"> $.getJSON('hoge.json', function(data) { ▼hoge.json var obj =([ [略], ]); var json_text = JSON.stringify(obj); // テスト出力 console.log(json_text); ■質問 ・$.getJSONにこの出力結果(json_text)を指定するためには、どうすれば良いでしょうか? ・一旦ファイル出力しなければいけないのでしょうか? ・どうやるのでしょうか? ・AJAXでサーバ側へデータを渡してファイル出力した後、$.getJSONでその出力したファイルを指定するしかない?

  • $.getJSONで複数のJSONを取得する

    $.getJSON("jsonGet.php", function (result) { でJSONファイルをゲットしています。 質問「もし2つ以上のJSONファイルが必要な場合、 どのように記述すればいいのでしょうか?」 $.getJSON("jsonGet1.php", function (result1) { $.getJSON("jsonGet2.php", function (result2) { } } のように入れ子にするのでしょうか? $.getJSON命令1つで複数のJSONファイルをリターンすることは不可能でしょうか? ロジック上、2つのJSONファイルを取得してから処理を継続します。 通常、どのようにコーディングするのか教えてください よろしくお願いします。

  • JSON の出力先ディレクトリの指定方法

    cakePHPの初心者です。 以下のようにPHPからJSON形式で、データファイルを出力したいと考えております。 $json = new Services_JSON; $encode = $json->encode($hoge); echo $encode; ですが、出力先ディレクトリの指定の仕方が分かりません。 ご存知の方、恐れ入りますが方法を教えて頂けますでしょうか?

    • ベストアンサー
    • PHP
  • jQueryの$.getJSONでデータを渡したい

    jQueryの$.getJSONでデータを渡したいのですが、 うまくいきません。 test.js {  "users": [   {    "name": "aoki",    "code": "0001"   },   {    "name": "ueno",    "code": "0002"   }  ] } 読み込む側 $.getJSON("test.js", { "name": "John", "code": "0003" }, function(json){  alert("JSON Data: " + json.users[0].name);  alert("JSON Data: " + json.users[1].name);  alert("JSON Data: " + json.users[2].name); }); { "name": "John", "code": "0003" }を渡しているのだから、 json.users[2].nameで、"John"が取得できると思ったのですが、 「'users.2.name' は Null またはオブジェクトではありません。」エラーになります

  • PHPからJavaScriptの指定形式へ変更

    PHPからJavaScriptの下記形式へ変更したいのですが、これは何と言う形式なのでしょうか? ・json? ・それともJavascriptオブジェクト? ■変更したいavaScript形式 [  ['hoge', 4.3],  ['piyo', 5.6] ], ■変更元のPHPデータ Array (  [0] => 'hoge',4.3  [1] => 'piyo',5.6 )

  • PHPの正規表現でHTMLタグの内容を抽出したい

    jqueryでPHPにurlを渡して、そのurlの中のtitleタグの内容を抽出したいと思ってます。が、うまく行きません。 ●jquery↓ <script type="text/javascript"> function site_check(){ var url = $("#url0").val(); if(url=="") return; $.getJSON("test.php?url=" + encodeURI(url) ,function(res){ $("#title").html(res.title); }); } </script> ●test.php↓ $html=file_get_contents($_GET["url"]); preg_match_all("/<title>(.*?)<\/title>/i",$html,$html_title); header('Content-type: application/json'); echo json_encode($html_title); このコードではなにもレスポンスが帰って来ません。 もし足りない情報がありましたらご指摘ください。

    • ベストアンサー
    • PHP
  • 【PHP,JavaScript】文字が誤変換される

    以下は、プログラムの一部でJavaScriptからPHPにJSONデータを送信する処理です。 引数を渡すJavaScript側(Extjsライブラリを利用)のプログラム // Ajaxリクエスト処理 Ext.Ajax.request({ url: "php/updatedata.php", success: handleSuccess, failure: handleFailure, params: { data: Ext.util.JSON.encode(data) } // パラメータをJSON形式にして送信 }); 配列dataの中身は「data[0] = 3,data[1] = パソコン」となっています。 Ext.util.JSON.encode(data)により配列dataをJSONに変換して 受信するPHP側のプログラム:updatedata.php JavaScriptで渡したJSONを$_REQUEST['data']で受信して中身を見ると以下のようになっています。 if (isset($_REQUEST['data'])) { $tmp = $_REQUEST['data']; 【受信したJSONデータの中身】 [{"id":"3","name":"繝代た繧ウ繝ウ"}] 「パソコン」という文字列が「繝代た繧ウ繝ウ」という文字列に変換されてしまっています。 Extjs側の「Ext.util.JSON.encode」が悪いのでしょうか、それともPHP側の「$_REQUEST」が悪いのでしょうか。はたまた何か別の原因があるのでしょうか。 ちなみに、環境は以下のようになっています。 WindowsXP,Windows7(両方とも同じ結果になってしまいました。) PHP5.3.1 Ext3.3.0 以上、よろしくお願い致します。

  • kimonoで取得したjsonファイルの出力

    kimonoで取得したjsonファイルの出力 以下のサイトを使用してスクレイピングしたjsonファイルをphpで表示させようとしたのですが、何も表示されません。助言をお願いします。 http://www.kimonolabs.com/ //jsonファイル { "name": "kokunai", "results": { "collection1": [ { "info": "【運航概況】\n本日4日および明日5日の運航状況は、以下のとおりです。" } ] } } //php記述 <?php $request = "http://www.kimonolabs.com/api/kimonoユーザID?apikey=APIキー"//URLの中身は上記jsonファイルと同一 $response = file_get_contents($request); $results = json_decode($response, TRUE); echo $results['results']['collection1'][info]; ?>

    • ベストアンサー
    • PHP
  • jquery PHP 値 ajax

    失礼します。現在jqueryで作成した2次元配列をPHP側に渡したいのですが上手くいきません。 jquery側のコンソールで確認した際にはsuccessの処理が行われ配列の中身がjson形式で表示されるのですが、その内容をPHP側で確認しようとするとNULLが返ってきてしまいます。 何卒ご教授よろしくお願いいたします。 html側 $(function(){ // 送るデータ形式はJSONでなければ、PHP側でエラーが出る.のでJSON.stringify()でJSON形式に変換 send_data= JSON.stringify(data); // 送信処理 $.ajax({ url: "ajax.php", // 送信先のPHP type: "POST", // POSTで送る contentType: "Content-Type: application/json; charset=UTF-8", //必須ではなさそうだが、サーバ側との整合のために明示しておいた方がよい。 // dataType: 'json', //受信形式 必須ではなさそうだがサーバ側との整合のために明示しておいた方がよい。 data:send_data //JSON形式の送信データ }).success(function(data, status, xhr) { // 通信成功時の処理 console.log("success"); console.log("data ="+data); console.log("status ="+status); console.log("xhr ="+xhr); }).error(function(xhr, status, error) { // 通信失敗時の処理 console.log("error"); }).complete(function(xhr, status) { // 通信完了時の処理 console.log("fin"); }); }) }) PHP側 二通り試してみました。 <?php //php://inputはPOSTの生データを取得できる $json = file_get_contents("php://input"); //JSON形式データをPHPの配列型に変換 $data = json_decode($json); var_dump($data) ; //POSTできたデータを格納 $hoge = $_POST['data']; var_dump($hoge);

    • ベストアンサー
    • AJAX
  • jQuery.getの引数dataで動的にするには

    お世話になります。 jQuery.get()の第二引数dataによって、動的にJSONを取得したいです。 第一引数urlがhttp://test.com 第二引数が{id:1,name:tanaka}としてgetした場合 http://text.com?id=1&name=tanaka とリクエストしてると考えてよいのでしょうか。 ある大手サイトでget()時、dataによって取得できるJSONが違うのですが、 そのURLの最後に拡張子がありません。 JSONは拡張子が無くても良いというのを知りましたが これはJSONの形式でそのように動的に発行しているのでしょうか。 もしくはサーブレットあたりが動いて動的にさせてるのでしょうか。 たぶんPHPとかではないですよね。 上の例でいくと http://text.com?id=2 http://text.com?id=5 http://text.com?id=15 これで取得できるのが違います。 どうなってるのかさっぱり判りません。 すみません、よろしくお願いいたします。

専門家に質問してみよう