308 votes

Je continue à obtenir "Uncaught SyntaxError : Unxpected token o"

J'essaie d'apprendre quelques notions de html/css/javascript, et je me suis donc lancé dans la rédaction d'un projet pédagogique.

L'idée était d'avoir un vocabulaire contenu dans un fichier json qui serait ensuite chargé dans une table. J'ai réussi à charger le fichier et à imprimer une de ses valeurs, après quoi j'ai commencé à écrire le code pour charger les valeurs dans le tableau.

Après avoir fait cela, j'ai commencé à obtenir une erreur, j'ai donc supprimé tout le code que j'avais écrit, me laissant avec une seule ligne (la même ligne qui avait fonctionné auparavant) ... seulement l'erreur est toujours là.

L'erreur est la suivante :

Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback

Mon code javascript est contenu dans un fichier séparé et se résume à ceci :

function loadPageIntoDiv(){
    document.getElementById("wokabWeeks").style.display = "block";
}

function loadWokab(){
    //also tried getJSON which threw the same error
    jQuery.get('wokab.json', function(data) {
        var glacier = JSON.parse(data);
    });
}

Et mon fichier JSON contient juste ce qui suit pour l'instant :

[
    {
        "english": "bag",
        "kana": "kaban",
        "kanji": "K"
    },

    {
        "english": "glasses",
        "kana": "megane",
        "kanji": "M"
    }
]

L'erreur est maintenant signalée à la ligne 11, qui est la ligne var glacier = JSON.parse(data); ligne.

Lorsque je supprime le fichier json, j'obtiens l'erreur suivante : "GET http://.../wokab.json 404 (Not Found)" pour que je sache qu'il le charge (ou du moins qu'il essaie de le faire).

5 votes

$.get peut reconnaître le json lorsqu'il est envoyé, d'où. var glacier = data; devrait suffire.

46 votes

En résumé : vous essayez de l'analyser deux fois.

0 votes

319voto

ek_ny Points 5137

On dirait que jQuery devine le type de données. Il effectue l'analyse JSON même si vous n'appelez pas getJSON()-- puis lorsque vous essayez d'appeler JSON.parse() sur un objet, vous obtenez l'erreur.

Pour plus d'explications, voir Réponse d'Aditya Mittal .

0 votes

Pourquoi donc ? La personne qui a voté en amont peut-elle aussi expliquer ?

13 votes

Aha, donc data[0].english renvoie "bag". On dirait que je n'ai pas besoin d'analyser le fichier json.

2 votes

C'est intéressant Je suppose que jquery devine le type de données et suppose qu'il s'agit de json. Je pense que getJson fonctionnerait également dans ce cas, n'est-ce pas ?

77voto

Andrius Bentkus Points 469

Le problème est très simple

jQuery.get('wokab.json', function(data) {
    var glacier = JSON.parse(data);
});

Vous l'interprétez deux fois. get utilise le dataType='json' Les données sont donc déjà au format json. Utiliser $.ajax({ dataType: 'json' ... pour définir spécifiquement le type de données renvoyées !

2voto

Brandon Points 1135

J'ai eu un problème similaire à l'instant et ma solution pourrait vous aider. J'utilise une iframe pour télécharger et convertir un fichier xml en json et le renvoyer dans les coulisses, et Chrome ajoutait des déchets aux données entrantes qui n'apparaissaient que par intermittence et provoquaient l'erreur "Uncaught SyntaxError : Unexpected token o".

J'accédais aux données de l'iframe comme suit :

$('#load-file-iframe').contents().text()

qui fonctionnait bien sur l'hôte local, mais lorsque je l'ai téléchargé sur le serveur, il n'a plus fonctionné qu'avec certains fichiers et uniquement lors du chargement des fichiers dans un certain ordre. Je ne sais pas vraiment ce qui a causé ce problème, mais cela l'a résolu. J'ai changé la ligne ci-dessus en

$('#load-file-iframe').contents().find('body').text()

une fois que j'ai remarqué un certain nombre d'erreurs dans la réponse HTML.

En bref, vérifiez vos données de réponse HTML brutes et vous trouverez peut-être quelque chose.

0 votes

D'accord, merci. Bizarrement, il semble parfois recevoir un objet json déjà analysé et parfois non. Je n'ai pas eu le temps de continuer le projet donc je ne sais pas si cela se produit de manière aléatoire (en fonction des navigateurs et des systèmes ou quelque chose comme ça). Merci pour l'indication, je la garderai à l'esprit.

0voto

Val Redchenko Points 333

Je n'ai pas de réponse directe, malheureusement, mais si l'erreur vient de JSON.parse - alors il devrait y avoir un moyen d'obtenir un rapport d'erreur. J'ai un bout de code qui fait exactement cela en PHP - à défaut d'autre chose, vous pourriez essayer d'analyser ce même fichier json en utilisant PHP et voir ce qui se passe. Rapport d'erreur JSON en PHP :

// debugging json_decode
if ( 1==2 && isset($formState) )
{
    echo 'here: ' . gettype( json_decode($formState->encoded_form) );    
//echo '<textarea>'.$formState->encoded_form.'</textarea>';
    // Define the errors.
    $constants = get_defined_constants(true);
    $json_errors = array();
    foreach ($constants["json"] as $name => $value) {
            if (!strncmp($name, "JSON_ERROR_", 11)) {
                $json_errors[$value] = $name;
            }
    }
    echo 'Last error: ', $json_errors[json_last_error()];
}

0voto

thexebolud Points 190

Assurez-vous que votre fichier JSON ne comporte aucun caractère de fin avant ou après. Peut-être un caractère non imprimable ? Vous pouvez essayer cette méthode :

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]

1 votes

JSON.parse('[{"english" : "bag", "kana" : "kaban", "kanji" : "K"},{"english" : "glasses", "kana" : "megane", "kanji" : "M"}]' ; Fonctionne correctement. Avez-vous essayé de remplacer cette ligne par alert(data) pour vérifier que le fichier se charge correctement ?

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