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
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.
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);
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 [
.
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.
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"}]';
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
[
{
"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.
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
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:
-
les caractères de Nouvelle ligne.
-
Onglets (oui, les onglets que vous pouvez produire avec la touche Tab!)
-
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.
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.
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;
}
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 ()
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]);
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));
où 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;
}
}
}
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.
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.
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
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".
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
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
utiliser eval
. Il prend L'expression/code JavaScript comme chaîne de caractères et l'évalue / l'exécute.
eval(inputString);