web-dev-qa-db-fra.com

AJAX appel and nettoyage JSON mais erreur de syntaxe: manquant; avant la déclaration

Je passe un appel JSONP entre domaines à l'aide du code suivant:

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

Lors du débogage dans Firebug, j'obtiens l'erreur suivante:

enter image description here

SyntaxError: missing ; before statement

Cependant, lorsque je transmets mon objet json (disponible via le lien dans le code JQ) via un outil tel que jsonlint.com, il indique qu'il s'agit d'un JSON valide. Et je ne trouve pas non plus d'anomalies. Comment pourrait-il retourner une erreur de syntaxe? Est-ce un détail JSONP que je ne reçois pas ou quoi?

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

Merci d'avance.

42
JZweige

JSONP n'est pas JSON. Une réponse JSONP serait constituée d'un script JavaScript contenant uniquement un appel de fonction (à une fonction prédéfinie) avec un argument (qui est un littéral d'objet JavaScript conforme à la syntaxe JSON).

La réponse que vous obtenez est JSON, pas JSONP. Vos efforts pour le gérer en tant que JSONP échouent.

Remplacez dataType: 'jsonp' par dataType: 'json' (ou supprimez entièrement la ligne, le serveur émet le type de contenu correct, vous n'avez donc pas besoin de le remplacer).

Étant donné que votre script s'exécute sur une origine différente du code JSON, vous devrez également effectuer les étapes (la plupart, mais pas toutes, nécessitant que vous contrôliez l'hôte servant le code JSON) pour résoudre le problème identique. Politique d'origine .

29
Quentin

L'erreur est due au fait qu'il renvoie JSON et non JSONP.

JSONP est censé ressembler à

someCallBackString({ The Object });
7
epascarello

Voici l'exemple de travail

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

Et vous devriez mettre callback au début de votre file.json comme:

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

4
whitesiroi

Comme epascarello a souligné , la réponse JSONP doit être envoyée comme suit:

callBackFunction({ JSON Object })

Et la fonction appelant peut alors être configurée comme suit:

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

Vous pouvez ensuite parcourir les données de réponse en tant que:

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

Si vous utilisez le paramètre " callback =? ", votre réponse côté serveur devrait ressembler à ceci:

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

Si le paramètre " callback =? " n'est pas défini, votre réponse devrait ressembler à ceci:

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

Si la question concerne Ruby, alors dans votre contrôleur, assurez-vous de rendre le format correctement. Exemple:

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

Dans votre méthode de rendu, vous devriez avoir le paramètre: callback sinon il sera rendu en json au lieu de jsonp.

0
Arman Ortega