Uncaught SyntaxError: token imprevisto con JSON.parse

cosa causa questo errore sulla terza riga?

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 

Apri console per visualizzare l’errore

products sono un object. (creando da un object letterale)

JSON.parse() viene utilizzato per convertire una stringa contenente notazione JSON in un object Javascript.

Il tuo codice trasforma l’object in una stringa (chiamando .toString() ) per provare ad analizzarlo come testo JSON.
L’impostazione predefinita .toString() restituisce "[object Object]" , che non è JSON valido; da qui l’errore

Diciamo che sai che è un JSON valido, ma stai ancora ricevendo questo …

In quel caso è probabile che ci siano caratteri nascosti / speciali nella stringa da qualunque fonte li trovi. Quando si incolla in un validatore, vengono persi, ma nella stringa sono ancora presenti. Questi caratteri, mentre sono invisibili, interromperanno JSON.parse()

Se s è il tuo JSON non elaborato, puliscilo con:

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

Sembra che tu voglia stringificare l’object.
Quindi, dovresti usare:

 JSON.stringify(products); 

Il motivo dell’errore è che JSON.parse() aspetta un valore String e i products sono una Array .

Nota: penso che tenti json.parse('[object Array]') che si lamenta di non aspettarsi token o dopo [ .

Ho trovato lo stesso problema con JSON.parse(inputString) .

Nel mio caso la stringa di input proviene dalla pagina del mio server [ritorno del metodo di una pagina] .

Ho stampato il typeof(inputString) – era una stringa, ancora si verifica l’errore.

Ho anche provato JSON.stringify(inputString) , ma non ha aiutato.

Più tardi ho scoperto che si trattava di un problema con il nuovo operatore di linea [\n] , all’interno di un valore di campo.

Ho fatto un rimpiazzo [con un altro personaggio, rimetto la nuova riga dopo l’analisi] e tutto funziona correttamente.

 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"}]; 

cambiare a

 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 è in attesa di un parametro String in. Devi stringificare il tuo object JSON per risolvere il problema.

 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" } ] 

Ecco il tuo Json perfetto che puoi analizzare.

Quando si utilizza il metodo POST o PUT, assicurarsi di stringificare la parte del corpo.

Ho documentato un esempio qui https://gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154

Un altro getcha che può causare l’eccezione "SyntaxError: Unexpected token" JSON.parse() "SyntaxError: Unexpected token" quando si chiama JSON.parse() utilizza uno dei seguenti valori nei valori stringa:

  1. Caratteri di nuova riga.

  2. Schede (sì, tabs che è ansible produrre con il tasto Tab!)

  3. Qualsiasi slash autonomo \ (ma per qualche motivo non / , almeno non su Chrome.)

(Per una lista completa vedi la sezione String qui .)

Ad esempio quanto segue ti porterà questa eccezione:

 { "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" } } 

Quindi dovrebbe essere cambiato in:

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

Il che, direi, lo rende piuttosto illeggibile nel formato JSON con una maggiore quantità di testo.

Spero che questo aiuti qualcun altro.

Il mio problema era che avevo commentato l’HTML in una funzione di callback PHP tramite AJAX che stava analizzando i commenti e restituiva JSON non valido.

Una volta rimosso l’HTML commentato, tutto andava bene e il JSON è stato analizzato senza problemi.

Ecco una funzione che ho fatto in base alle risposte precedenti: funziona sulla mia macchina ma su 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; } 

prodotti è un array che può essere utilizzato direttamente:

 var i, j; for(i=0;i 

Ora apparentemente \r , \b , \t , \f , ecc non sono gli unici caratteri problematici che possono darti questo errore.

Nota che alcuni browser potrebbero avere requisiti aggiuntivi per l’input di JSON.parse .

Esegui questo codice di prova sul tuo browser:

 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 su Chrome, vedo che non consente JSON.parse(String.fromCharCode(0x22, x, 0x22)); dove x è 34, 92 o da 0 a 31.

I caratteri 34 e 92 sono rispettivamente " e \ caratteri, e di solito sono attesi e debitamente escapati. Si tratta di caratteri da 0 a 31 che potrebbero causare problemi.

Per facilitare il debug, prima di eseguire JSON.parse(input) , verificare innanzitutto che l'input non contenga caratteri problematici:

 function VerifyInput(input){ for(var x=0; x= 0 && c < = 31){ throw 'problematic character found at position ' + x; } } } 

Perché hai bisogno di JSON.parse? È già in una matrice di formato object.

Meglio usare JSON.stringify come di seguito: var b = JSON.stringify(products);

Questo potrebbe aiutarti.

Oh uomo, le soluzioni in tutte le risposte di cui sopra fornite finora non ha funzionato per me. Ho avuto un problema simile proprio ora. Sono riuscito a risolverlo con il wrapping con la citazione. Guarda lo screenshot. Whoo.

inserisci la descrizione dell'immagine qui

Originale:

 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’errore che si sta verificando, ovvero “token imprevisto o”, è dovuto al fatto che JSON è previsto ma l’object viene ottenuto durante l’analisi. Quella “o” è la prima lettera della parola “object”.

Devi esibire una stringa json valida su https://jsonformatter.curiousconcept.com/

la stringa json valida deve avere una virgoletta doppia.

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

nessuna virgola causa errore

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

virgoletta causa errore

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

Se ci sono spazi iniziali o finali, non sarà valido. Gli spazi finali / iniziali possono essere rimossi come

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

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

Utilizzare eval . Richiede l’espressione / codice JavaScript come stringa e lo valuta / esegue.

 eval(inputString);