69 votes

json Erreur de syntaxe non rencontrée : Unxpected token :

J'essaie d'effectuer un appel et de récupérer un fichier JSON très simple, d'une ligne.

$(document).ready(function() {

    jQuery.ajax({ 
        type: 'GET',
        url: 'http://wncrunners.com/admin/colors.json' ,
        dataType: 'jsonp', 
        success: function(data) { 
            alert('success');
        }
    });

  });//end document.ready

Voici la demande RAW :

GET http://wncrunners.com/admin/colors.json?callback=jQuery16406345664265099913_1319854793396&_=1319854793399 HTTP/1.1
Host: wncrunners.com
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2
Accept: */*
Referer: http://localhost:8888/jquery/Test.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Voici la réponse RAW :

HTTP/1.1 200 OK
Date: Sat, 29 Oct 2011 02:21:24 GMT
Server: Apache/1.3.33 (Unix) mod_ssl/2.8.22 OpenSSL/0.9.7d SE/0.5.3
Last-Modified: Fri, 28 Oct 2011 17:48:47 GMT
ETag: "166a2402-10-4eaaeaff"
Accept-Ranges: bytes
Content-Length: 16
Content-Type: text/plain
Connection: close

{"red" : "#f00"}

Le JSON revient dans la réponse (rouge : #f00), mais Chrome rapporte Erreur de syntaxe involontaire : Unxpected token : colors.json:1

Si je navigue directement vers l'url elle-même, le JSON est renvoyé et s'affiche dans le navigateur.

Si je colle le contenu de colors.json dans JSLINT, le json est validé.

Avez-vous une idée de la raison pour laquelle je n'obtiens pas cette erreur et que je n'arrive jamais au rappel de réussite ?

EDIT - L'appel jQuery.ajax() ci-dessus fonctionne parfaitement sur jsfiddle.net, et renvoie l'alerte 'success' comme prévu.

EDIT 2 - Cette URL fonctionne bien (http://api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/q/IA/Cedar\_Rapids.json). J'ai remarqué qu'elle était renvoyée sous la forme TYPE : text/javascript et que Chrome ne générait pas de jeton inattendu. J'ai testé plusieurs autres URL et la SEULE qui n'envoie pas le jeton inattendu est celle de wunderground qui est renvoyée sous la forme TYPE : text/javascript.

Les flux retournés en tant que text/plain et application/json ne sont pas analysés correctement.

0 votes

J'ai réalisé qu'en tapant l'url dans un navigateur, le "#" n'apparaît pas dans le json. wncrunners.com/admin/colors.json

0 votes

Merci pour votre contribution. J'ai retiré le # pour tester la théorie de Keith. Cette suppression n'a pas affecté l'erreur. J'ai également supprimé l'extension .json du fichier. Même erreur.

130voto

John Flatness Points 14473

Vous avez dit à jQuery de s'attendre à un JSONP c'est pourquoi jQuery a ajouté la fonction callback=jQuery16406345664265099913_1319854793396&_=1319854793399 à l'URL (vous pouvez le voir dans votre vidage de la requête).

Ce que vous renvoyez est JSON, pas JSONP. Votre réponse ressemble à

{"red" : "#f00"}

et jQuery s'attend à quelque chose comme ça :

jQuery16406345664265099913_1319854793396({"red" : "#f00"})

Si vous avez besoin d'utiliser JSONP pour contourner la même politique d'origine, le serveur qui sert le service colors.json doit être en mesure de renvoyer une réponse JSONP.

Si la même politique d'origine n'est pas un problème pour votre application, il vous suffit de corriger l'erreur d'origine. dataType dans votre jQuery.ajax l'appel à être json au lieu de jsonp .

3 votes

Merci John. Si je prends le même code et que je le dirige vers api.wunderground.com/api/8ac447ee36aa2505/geolookup/conditions/ ' alors la réponse contient bien le jQueryxxxx() entourant les données json, le code s'exécute correctement et j'obtiens l'alerte "Succès". Je ne peux pas modifier la façon dont le serveur distant sert le fichier JSON. Si j'utilise dataType : 'json', j'obtiens XMLHttpRequest ne peut pas être chargé isohunt.com/js/json.php?ihq=test . Origine localhost:8888 n'est pas autorisé par Access-Control-Allow-Origin.

0 votes

Ok. L'URL de Weather Underground que vous avez donné fait répondre aux demandes JSONP. (Vous verrez cela si vous ajoutez ?callback=something à cette URL. L'erreur que vous obtenez lorsque vous utilisez dataType: json c'est à cause de la même politique d'origine. Permettez-moi d'ajouter à ma réponse.

0 votes

Le problème semble être que si le serveur répond par Type : text/javascript, Chrome ne signale pas d'erreur de syntaxe non détectée. Si le serveur distant répond avec le type : text/plain ou application/json, alors Chrome signale l'Uncaught SyntaxError.

4voto

S. Rehan Points 54

J'ai passé les derniers jours à essayer de résoudre ce problème moi-même. L'utilisation de l'ancien type de données json pose des problèmes d'origine croisée, tandis que la définition du type de données en jsonp rend les données "illisibles", comme expliqué ci-dessus. Il y a donc apparemment deux façons de s'en sortir, la première n'a pas fonctionné pour moi mais semble être une solution potentielle et que je fais peut-être quelque chose de mal. Ceci est expliqué ici [ https://learn.jquery.com/ajax/working-with-jsonp/ ].

Celui qui a fonctionné pour moi est le suivant : 1- télécharger le plug in ajax cross origin [ http://www.ajax-cross-origin.com/ ]. 2- ajoutez-y un lien script juste en dessous du lien normal de jQuery. 3- ajoutez la ligne "crossOrigin : true," à votre fonction ajax.

C'est bon ! Voici mon code de travail pour cela :

  $.ajax({
      crossOrigin: true,
      url : "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.86,151.195&radius=5000&type=ATM&keyword=ATM&key=MyKey",
      type : "GET",
      success:function(data){
         console.log(data);
      }
    })

2voto

user1510230 Points 102

J'ai eu le même problème et la solution a été d'encapsuler le json dans cette fonction.

jsonp(

.... votre json ...

)

6 votes

Est-ce que vous encapsulez du côté du serveur ? Ou existe-t-il un moyen de le faire du côté client ?

1voto

Keith.Abramo Points 5155

Cet hexagone devra peut-être être mis entre guillemets et transformé en chaîne de caractères. Javascript n'aime peut-être pas le caractère #.

0 votes

Keith, merci pour votre réponse. Pour tester, j'ai supprimé le signe # du fichier de sorte que le contenu est maintenant {"red" : "f00"}, mais la même erreur persiste. Une chose que je remarque est que le Content-Type de la réponse est text/plain plutôt que application/json.

0 votes

Pour un autre test, j'ai renommé le fichier en couleurs (sans extension) et j'obtiens exactement la même erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X