web-dev-qa-db-ja.com

AJAX JSONを呼び出してクリーンアップしますが、構文エラー:不明; beforeステートメント

このコードを使用して、クロスドメインJSONP呼び出しを行っています。

jQuery.ajax({
        async: true,
        url: 'http://mnews.hostoi.com/test.json',
        dataType: 'jsonp',
        method: "GET",
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(textStatus + ': ' + errorThrown);
        },
        success: function (data, textStatus, jqXHR) {
            if (data.Error || data.Response) {
                exists = 0;
            }
        }
    });

Firebugでデバッグすると、次のエラーが表示されます。

enter image description here

SyntaxError: missing ; before statement

ただし、jsonlint.comなどのツールを介してjsonオブジェクト(JQコードのリンクから入手可能)を渡すと、有効なJSONであると表示されます。そして、私も異常を見つけません。どのように構文エラーを返すのでしょうか?それは私が得ていないJSONPの詳細ですか?

JSONサンプル

{"news":[ {
  "sentences": [
    "Neuroscientists have discovered abnormal neural activity...", 
    "The researchers found that these mice showed many symptoms...", 
    "\"Therefore,\" the study authors say, \"our findings provide a novel.."
  ], 
  "summaryId": "ZJEmY5", 
  "title": "Abnormal neural activity linked to schizophrenia"
}]}

前もって感謝します。

42
JZweige

JSONPはJSONではありません。 JSONP応答は、1つの引数(JSON構文に準拠するJavaScriptオブジェクトリテラル)を持つ関数呼び出し(定義済み関数への)のみを含むJavaScriptスクリプトで構成されます。

取得する応答はJSONPではなくJSONであるため、JSONPとして処理しようとすると失敗します。

変化する dataType: 'jsonp'からdataType: 'json'(または行を完全に削除すると、サーバーは正しいコンテンツタイプを発行するため、オーバーライドする必要はありません)。

スクリプトはJSONとは別のOriginで実行されているため、 ステップを取る (すべてではありませんが、JSONを提供するホストを制御する必要があります)を回避する必要もあります 同じオリジンポリシー

29
Quentin

エラーは、JSONPではなくJSONを返すためです。

JSONPは次のよ​​うになります

someCallBackString({ The Object });
7
epascarello

これが実際の例です

$.ajax({
 type: 'GET',
 url: 'http://xxx.amazonaws.com/file.json',
 dataType: 'jsonp',
 jsonpCallback: 'callback',
 success: function(json){
   console.log(json);
 }
});

file.jsonのようにcallbackを次のように配置する必要があります。

callback({"item":{".......

4
whitesiroi

Epascarello 指摘 のように、JSONP応答は次のように送信する必要があります。

callBackFunction({ JSON Object })

そして、呼び出し元関数は次のように設定できます:

var url =  "http://someremoteurl.com/json";
    $.getJSON(url + "?callback=?", null, function(data) {
    callBackFunction(data);
});

次に、応答データを次のようにループできます。

function callBackFunction(data)
{
   console.log(data);
}
2
shasi kanth

callback =?」パラメーターを使用している場合、サーバー側の応答は次のようになります。

$_callback = $_GET['callback'];    
echo $_callback . '(' . json_encode(YOUR_VARIABLE) . ');';

callback =?」パラメータが定義されていない場合、応答は次のようになります。

echo '[' . json_encode($_return_array) . ']';
1
Andrew Bursov

質問がRubyに関連している場合は、コントローラーで形式を正しくレンダリングするようにしてください。例:

def view_product
   data = Product.find params[:id]
   render :json =>  data, :callback => params[:callback]
end

レンダリングメソッドでは、:callbackパラメーターが必要です。そうでない場合、jsonpではなくjsonでレンダリングされます。

0
Arman Ortega