web-dev-qa-db-fra.com

Uncaught SyntaxError: Jeton inattendu avec JSON.parse

qu'est-ce qui cause cette erreur sur la troisième ligne?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Ouvrir la console pour voir l'erreur

142
coiso

products est un objet. (création d'un littéral d'objet)

JSON.parse() est utilisé pour convertir un string contenant la notation JSON en un objet Javascript.

Votre code transforme l'objet en chaîne (en appelant .toString()) afin d'essayer de l'analyser en tant que texte JSON.
La .toString() par défaut renvoie "[object Object]", ce qui n’est pas un JSON valide; d'où l'erreur.

185
SLaks

Disons que vous savez que c'est un JSON valide mais que vous obtenez toujours cela ... 

Dans ce cas, il est probable que la chaîne contienne des caractères spéciaux/cachés, quelle que soit leur source. Lorsque vous collez dans un validateur, ils sont perdus - mais dans la chaîne, ils sont toujours là. Ces caractères, bien qu'invisibles, vont casser JSON.parse()

Si s est votre JSON brut, nettoyez-le avec:

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);
82
EdH

Il semble que vous souhaitiez stringifier l'objet. Alors faites ceci: 

JSON.stringify(products);

La raison de l'erreur est que JSON.parse() s'attend à une valeur String et que products est une Array.

Note: Je pense qu'il tente json.parse('[object Array]') qui se plaint qu'il ne s'attendait pas à un jeton o après [.

54
Onur Yıldırım

J'ai trouvé le même problème avec JSON.parse(inputString).

Dans mon cas, la chaîne d'entrée provient de la page de mon serveur [retour d'une méthode de page].

J'ai imprimé la typeof(inputString) - c'était une chaîne, l'erreur se produit toujours.

J'ai aussi essayé JSON.stringify(inputString), mais cela n'a pas aidé.

Plus tard, j'ai découvert qu'il s'agissait d'un problème avec l'opérateur de nouvelle ligne [\n], dans une valeur de champ.

J'ai fait un replace [avec un autre personnage, remettez la nouvelle ligne après l'analyse] et tout fonctionne correctement.

26
Derin
products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

changer à 

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';
10
pktangyue

JSON.parse attend un paramètre String in. Vous devez hiérarchiser votre objet JSON pour résoudre le problème. 

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem
7
Térence
[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

Voici votre Json parfait que vous pouvez analyser.

3
San

Voici une fonction que j'ai créée à partir des réponses précédentes: cela fonctionne sur ma machine mais en YMMV.

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              //https://stackoverflow.com/questions/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.Push(JSON.parse(element));
              }, this);

              return result;
            }
2
tmurphree

Lorsque vous utilisez la méthode POST ou PUT, assurez-vous de bien ficeler la partie du corps.

J'ai documenté un exemple ici https://Gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154

2
Manjunath Reddy

Un autre piège qui peut entraîner une exception "SyntaxError: Unexpected token" lorsque l'appel JSON.parse() utilise l'un des éléments suivants dans les valeurs de chaîne:

  1. Caractères de nouvelle ligne.

  2. Onglets (oui, onglets que vous pouvez produire avec la touche Tab!)

  3. Toute barre oblique autonome \ (mais pour une raison quelconque pas /, du moins pas sur Chrome.)

(Pour une liste complète, voir la section String ici .)

Par exemple, ce qui suit vous obtiendrez cette exception:

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

Donc, il devrait être changé pour:

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

Ce qui, je devrais dire, le rend tout à fait illisible dans un format uniquement JSON avec une plus grande quantité de texte.

1
c00000fd

Vous devez valider la chaîne JSON sur https://jsonformatter.curiousconcept.com/

chaîne JSON valide doit avoir une double citation.

JSON.parse({"u1":1000,"u2":1100})       // will be ok

aucune citation cause d'erreur

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

erreur de citation simple

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1
1
hoogw

La seule erreur que vous faites est que vous analysez un objet déjà analysé.

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products[0].name); //name of item at 0th index

si vous voulez imprimer un JSON entier, utilisez JSON.stringify ()

1
Kiran Maniya

Espérons que cela aide quelqu'un d'autre.

Mon problème était que j'avais commenté HTML dans une fonction de rappel PHP via AJAX qui analysait les commentaires et renvoyait un JSON non valide.

Une fois que j'ai supprimé le code HTML commenté, tout était bon et le JSON a été analysé sans aucun problème.

1
Chris

products est un tableau qui peut être utilisé directement:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);
0
ic3b3rg

Cela peut arriver pour de nombreuses raisons, mais probablement pour un caractère invalide, vous pouvez donc utiliser JSON.stringify(obj); pour transformer votre objet en JSON, mais souvenez-vous qu'il s'agit d'une expression JQUERY. 

0
Elvis Silva Noleto

Pourquoi avez-vous besoin de JSON.parse? C'est déjà en tableau de format d'objet.

Mieux vaut utiliser JSON.stringify comme suit: var b = JSON.stringify(products);

Cela peut vous aider.

0
abhijit padhy

Apparemment, \r, \b, \t, \f, etc. ne sont pas les seuls caractères problématiques qui peuvent vous donner cette erreur.

Notez que certains navigateurs peuvent avoir additionnel exigences pour la saisie de JSON.parse.

Exécutez ce code de test sur votre navigateur:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.Push(x);
    }
}
console.log(arr);

En testant sur Chrome, je constate qu'il n'autorise pas JSON.parse(String.fromCharCode(0x22, x, 0x22));x est 34, 92 ou compris entre 0 et 31. 

Les caractères 34 et 92 sont respectivement les caractères " et \ et ils sont généralement attendus et correctement échappés. Ce sont les caractères 0 à 31 qui vous donneraient des problèmes.

Pour vous aider avec le débogage, avant de procéder à JSON.parse(input), vérifiez d’abord que l’entrée ne contient pas de caractères posant problème:

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}
0
Pacerier

J'ai cette erreur parce que l'API qui a renvoyé l'objet JSON donnait une erreur (dans mon cas Code Igniter, retourne un code HTML lorsque le code php échoue) afin qu'il ne soit pas un objet JSON.

Vérifiez les phrases SQL et le code PHP, puis testez-les avec Postman (ou un autre testeur d'API).

0
Ari Waisberg

L’erreur que vous obtenez, c’est-à-dire «jeton inattendu o», est parce que json est attendu mais que l’objet est obtenu lors de l’analyse. Ce "o" est la première lettre de Word "objet".

0
Shashank Bodkhe

S'il y a des espaces de début ou de fin, il sera invalide . Les espaces de début/fin peuvent être supprimés comme suit:

mystring = mystring.replace(/^\s+|\s+$/g, "");

Source: http://www.toptip.ca/2010/02/javascript-trim-leading-or-trailing.html

0
att

Oh mec, les solutions proposées dans toutes les réponses ci-dessus ne m'ont pas aidé. J'ai eu un problème similaire tout à l'heure. J'ai réussi à le résoudre avec un emballage avec la citation. Voir la capture d'écran. Whoo.

 enter image description here

Original:

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

0
Well Smith