SyntaxError Uncaught: jeton inattendu avec JSON.analyser

Quelle est la cause de 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

Ouvrez la console pour afficher l'erreur

130
demandé sur H. Pauwelyn 2013-01-21 07:34:08

20 réponses

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

JSON.parse() est utilisé pour convertir une chaîne de caractères contenant la notation JSON en un objet Javascript.

votre code transforme l'objet en chaîne de caractères (en appelant .toString() ) afin d'essayer de le parser en texte JSON.

La valeur par défaut .toString() renvoie "[object Object]" , qui n'est pas valide JSON; d'où l'erreur.

171
répondu SLaks 2013-01-21 03:36:29

disons que vous savez que C'est JSON valide, mais vous avez toujours ça...

dans ce cas, il est probable qu'il y ait des caractères cachés/spéciaux dans la chaîne de caractères, de quelque source que ce soit. Quand vous collez dans un validateur, ils sont perdus - mais dans la chaîne ils sont toujours là. Ces chars, bien qu'invisibles, casseront JSON.parse()

si s est votre JSON brut, alors 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);
78
répondu EdH 2014-12-31 19:13:02

il semble que vous vouliez stringifier l'objet.

Vous devez donc utiliser:

JSON.stringify(products);

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

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

48
répondu Onur Yıldırım 2017-02-20 12:40:34

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

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

j'ai imprimé le typeof(inputString) - c'était string, mais l'erreur se produit.

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

plus tard , j'ai trouvé que c'était un problème avec le nouvel opérateur de ligne [\n] , à l'intérieur d'une valeur de champ.

j'ai fait un remplacer [avec un autre caractère, remettre la nouvelle ligne après analyse] et tout fonctionne très bien.

25
répondu Derin 2016-11-04 15:10:20
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"}]';
9
répondu pktangyue 2013-01-21 03:35:58

JSON.parse attend une chaîne de caractères dans le paramètre. Vous devez stringifier 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
6
répondu Térence 2016-10-23 11:09:39
[
  {
    "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
répondu San 2017-03-06 09:45:43

lorsque vous utilisez la méthode POST ou PUT, assurez-vous de stringifier la partie du corps.

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

2
répondu Manjunath Reddy 2017-01-06 04:33:52

un autre gotcha qui peut résulter en "SyntaxError: Unexpected token" exception lors de l'appel JSON.parse() utilise l'un des suivants dans les valeurs de chaîne de caractères:

  1. les caractères de Nouvelle ligne.

  2. Onglets (oui, les 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 Chaîne de la section .)

par exemple ce qui suit vous obtiendra 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 un-escaped"
    }
}

donc il devrait être changé en:

{
    "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 dois le dire, le rend tout à fait illisible dans le format JSON-seulement avec une plus grande quantité de texte.

1
répondu c00000fd 2014-10-10 23:50:21

J'espère que ça aidera 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 retournait JSON invalide.

une fois que J'ai enlevé le HTML commenté, tout était bon et le JSON a été analysé sans problèmes.

1
répondu Chris 2015-11-11 01:56:42

Voici une fonction que j'ai créée à partir de réponses précédentes: elle fonctionne sur ma machine mais 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
              ///q/uncaught-syntaxerror-unexpected-token-with-json-parse-33132/"\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;
            }
1
répondu tmurphree 2017-08-31 19:35:21

la seule erreur que vous faites est, vous parsez déjà objet parsé donc il est erreur de lancer, utilisez ceci et vous serez bon à aller.

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 JSON entier, utilisez JSON.stringify ()

1
répondu Kiran Maniya 2018-09-14 05:11:48

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
répondu ic3b3rg 2013-01-21 03:48:56

maintenant 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 des exigences supplémentaires pour l'entrée de JSON.parse .

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

test sur Chrome, je vois qu'il ne permet pas JSON.parse(String.fromCharCode(0x22, x, 0x22));x est 34, 92, ou de 0 à 31.

les caractères 34 et 92 sont les caractères " et \ respectivement, et ils sont généralement attendus et correctement échappés. C'est les séries de 0 à 31 qui vous poseraient des problèmes.

pour aider au débogage, avant de faire JSON.parse(input) , Vérifiez d'abord que l'entrée ne contient pas de caractères problématiques:

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
répondu Pacerier 2017-03-20 15:22:17

pourquoi vous avez besoin de JSON.analyser? C'est déjà dans le tableau du format d'objet.

utilisez plutôt JSON.stringify comme ci-dessous : var b = JSON.stringify(products);

Cela peut vous aider.

0
répondu abhijit padhy 2017-09-14 05:03:00

Oh, l'homme, des solutions dans toutes les réponses ci-dessus, à ce jour n'a pas fonctionné pour moi. J'ai eu un problème similaire, juste maintenant. J'ai réussi à le résoudre en l'enveloppant avec la citation. Voir la capture d'écran. Whoo.

enter image description here

Origine:

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
répondu Well Smith 2018-05-30 13:44:12

l'erreur que vous obtenez i.e." inattendu token o " est parce que json est attendu mais l'objet est obtenu lors de l'analyse. "O" est la première lettre du mot "objet".

0
répondu Shashank Bodkhe 2018-07-15 11:54:14

vous devez valider la chaîne json à https://jsonformatter.curiousconcept.com /

chaîne JSON valide doit avoir une double citation.

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

pas de citer cause d'erreur

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

apostrophe cause d'erreur

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1
0
répondu hoogw 2018-08-20 13:19:11

S'il y a des espaces avant ou arrière, il sera invalide. Les espaces de fuite / D'entrée peuvent être enlevés en tant que

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

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

0
répondu att 2018-08-28 10:07:19

utiliser eval . Il prend L'expression/code JavaScript comme chaîne de caractères et l'évalue / l'exécute.

eval(inputString);
-22
répondu Kasthuri 2013-09-20 05:57:09