wake-up-neo.net

AJAX Aufruf und Bereinigung von JSON, aber Syntaxfehler: fehlt; vor der Aussage

Ich mache einen domänenübergreifenden JSONP-Aufruf mit diesem Code:

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;
            }
        }
    });

Beim Debuggen in Firebug erhalte ich folgende Fehlermeldung:

enter image description here

SyntaxError: missing ; before statement

Wenn ich jedoch mein json-Objekt (das über den Link im JQ-Code verfügbar ist) durch ein Tool wie jsonlint.com weiterleitet, heißt es, dass es gültiges JSON ist. Und ich finde auch keine Anomalien. Wie könnte es einen Syntaxfehler zurückgeben? Gibt es irgendein JSONP-Detail, das ich nicht bekomme oder was?

JSON-Beispiel

{"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"
}]}

Danke im Voraus.

42
JZweige

JSONP ist nicht JSON. Eine JSONP-Antwort würde aus einem JavaScript-Skript bestehen, das nur einen Funktionsaufruf (für eine vordefinierte Funktion) mit einem Argument enthält (das ist ein JavaScript-Objektliteral, das der JSON-Syntax entspricht).

Die Antwort, die Sie erhalten, ist JSON, nicht JSONP. Daher scheitern Ihre Bemühungen, es als JSONP zu behandeln.

Ändern Sie dataType: 'jsonp' in dataType: 'json' (oder entfernen Sie die Zeile vollständig. Der Server gibt den richtigen Inhaltstyp aus, sodass Sie ihn nicht überschreiben müssen).

Da Ihr Skript auf einem anderen Origin als JSON ausgeführt wird, müssen Sie außerdem Schritte ausführen ausführen (die meisten, aber nicht alle müssen den Host steuern, der den JSON bereitstellt), um das gleich zu umgehen Ursprungspolitik .

29
Quentin

Der Fehler liegt darin, dass JSON nicht JSONP zurückgegeben wird.

JSONP soll aussehen

someCallBackString({ The Object });
7
epascarello

Hier ist das Arbeitsbeispiel

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

Und Sie sollten callback am Anfang Ihres file.json setzen:

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

4
whitesiroi

Wie epascarello weist auf hin, muss die JSONP-Antwort wie folgt gesendet werden:

callBackFunction({ JSON Object })

Die Anruferfunktion kann dann wie folgt eingerichtet werden:

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

Dann können Sie die Antwortdaten als Schleife durchlaufen:

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

Wenn Sie den Parameter " callback =? " verwenden, sollte Ihre Antwort auf der Serverseite folgendermaßen aussehen:

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

Wenn der Parameter " callback =? " nicht definiert ist, sollte Ihre Antwort folgendermaßen aussehen:

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

Wenn sich die Frage auf Ruby bezieht, stellen Sie sicher, dass Sie das Format in Ihrem Controller korrekt rendern. Beispiel:

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

In Ihrer Render-Methode sollten Sie den Parameter: callback verwenden, sonst wird er in json anstelle von jsonp dargestellt.

0
Arman Ortega