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
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.
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);
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 [
.
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.
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 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
[
{
"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.
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;
}
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
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:
Caractères de nouvelle ligne.
Onglets (oui, 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 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.
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
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 ()
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.
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]);
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.
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.
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));
où 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;
}
}
}
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).
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".
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
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.
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