Uncaught SyntaxError: token imprevisto con JSON.parse


192

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 la console per visualizzare l'errore


16
Non hai JSON? È un array / oggetto letterale.
Bergi,

Risposte:


220

productsè un oggetto. (creando da un oggetto letterale)

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

Il codice trasforma l'oggetto in una stringa (chiamando .toString()) per provare ad analizzarlo come testo JSON. Viene restituito il
valore predefinito , che non è JSON valido; da qui l'errore..toString()"[object Object]"


1
non è un array? Perché è un oggetto. Gli oggetti iniziano con {e le matrici iniziano con [? o sono falso qui

4
Le matrici sono oggetti; questo è ciò che .toString()ritorna (secondo le specifiche).
SLaks

1
La soluzione è prima di stringere l'oggetto?
Mohammed Noureldin,

6
@MohammedNoureldin: No; la soluzione è non fare nulla e usare il tuo oggetto.
SLaks

2
Cosa succede se ricevo i miei dati da un servizio remoto utilizzando Ajax, che mi restituisce la risposta Json? E voglio che la risposta venga salvata nell'oggetto array JavaScript?
Mohammed Noureldin,

125

Supponiamo che tu sappia che è valido JSON ma stai ancora ottenendo questo ...

In tal caso è probabile che ci siano caratteri nascosti / speciali nella stringa da qualsiasi fonte li stai ricevendo. Quando si incolla in un validatore, vengono persi, ma nella stringa sono ancora lì. Quei caratteri, sebbene invisibili, si romperannoJSON.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);

Stavo ottenendo l'errore e l'ho rintracciato in uno strano personaggio in una stringa. Ho usato il tuo metodo per rimuovere i caratteri JSON non validi e ha funzionato.
albertski,

1
sono venuto qui due volte adesso. grazie
Benjamin Hoffman,

Hai un carattere speciale finale dopo la decodifica Base64, il tuo metodo mi ha aiutato molto! Grazie
Guillaume

non fidarti di una fonte che risponde con JSON non valido. Informali semplicemente che i dati sono corrotti. dovrebbero ripararlo. se provi a "recuperare" la risposta in questo modo o in modi simili, manterrai una comunicazione instabile.
Onur Yıldırım,

Dovrebbe essere s = s.replace(/[\u0000-\u001F]+/g,""); invece di s = s.replace(/[\u0000-\u0019]+/g,""); , per sostituire tutti i caratteri di controllo. Destra?
HongchaoZhang,

64

Sembra che tu voglia stringere l'oggetto. Quindi fai questo:

JSON.stringify(products);

Il motivo dell'errore è che si JSON.parse()aspetta un Stringvalore ed productsè un Array.

Nota: Penso che i tentativi json.parse('[object Array]')che si lamenta che non si aspettava di token odopo [.


28

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

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

Ho stampato typeof(inputString)- era una stringa, si verifica ancora l'errore.

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

Successivamente 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 qualche altro personaggio, rimetto la nuova riga dopo l'analisi] e tutto funziona bene.


2
Anche il nuovo personaggio della linea era un mio problema. Quindi, come possiamo ripristinare tali dati?
Kolenda,

@kolenda Hai JSON non valido. È necessario modificare il server per utilizzare un serializzatore JSON effettivo che restituisca JSON valido.
SLaks

Ho avuto un problema simile ma invece di "\ n" avevo un "\ e" all'interno di un percorso (ho cambiato il codice lato server per usare "/" invece di "\" e tutto funzionava di nuovo)
Adam Tal

usa una via di fuga in cui \ n sarebbe \\ n
Paul Gregoire,

14

JSON.parse è in attesa di una stringa nel parametro. Devi risolvere il tuo oggetto 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

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

cambia in

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

2
@SLaks yep, OP può utilizzare direttamente i prodotti. ma se vuole usarlo JSON.parse, gli arg devono essere una stringa.
pktangyue,

cosa dovrei fare in ASP Classic perché "è un commento
ashish bhatt del

1
@ashishbhatt puoi usare ", quindi cambia tutti gli altri" in \ "
pktangyue,

2
Qualcosa del genereJSON.parse(products.replace(/'/g, '"'))
programmatore chimico il

11

È necessario convalidare la stringa JSON qui .

Una stringa JSON valida deve avere virgolette doppie attorno alle chiavi:

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

Se non ci sono virgolette, si verificherà un errore:

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

L'uso di virgolette singole causerà anche un errore:

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

Nel mio caso, Grails 2.5.6 viene visualizzato render ([key: value])con virgolette singole, portando all'errore JSON parseError nella posizione 1 di jquery Ajax. render (groovy.json.JsonOutput.toJson ([key:value]))mi ha aiutato.
Philburns,


3
[
  {
    "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.


3

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
              ///programming/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

Un altro gotcha che può provocare "SyntaxError: Unexpected token"un'eccezione quando si chiama JSON.parse()sta usando uno dei seguenti valori di stringa:

  1. Caratteri di nuova riga.

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

  3. Qualsiasi barra stand-alone \(ma per qualche ragione no /, almeno non su Chrome.)

(Per un elenco completo vedere la sezione String qui .)

Ad esempio, quanto segue riceverà 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, dovrei dire, lo rende piuttosto illeggibile in formato solo JSON con una maggiore quantità di testo.



1

Spero che questo aiuti qualcun altro.

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

Una volta rimosso l'HTML commentato, tutto andava bene e JSON veniva analizzato senza problemi.


0

prodotti è un array che può essere utilizzato direttamente:

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

Ora a quanto pare \r, \b, \t,\f , ecc non sono i caratteri problematici solo che può dare questo errore.

Si noti che alcuni browser potrebbero avere requisiti aggiuntivi per l'input diJSON.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));dovex sia 34, 92 o da 0 a 31.

Chars 34 e 92 sono l' "e \personaggi, rispettivamente, e di solito sono attesi e adeguatamente fuggiti. Sono i caratteri da 0 a 31 che potrebbero darti problemi.

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

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

Perché hai bisogno di JSON.parse? È già in formato array.

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

Questo può aiutarti.


0

Oh amico, le soluzioni in tutte le risposte sopra fornite finora non hanno 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 qui la descrizione dell'immagine

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


0

L'errore che stai ricevendo, ad esempio "token imprevisto o", è dovuto al fatto che JSON è previsto ma l'oggetto viene ottenuto durante l'analisi. Quella "o" è la prima lettera della parola "oggetto".


0

L'unico errore che stai facendo è che stai analizzando un oggetto già analizzato, quindi sta generando un errore, usa questo e sarai a posto.

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

se si desidera stampare l'intero json, utilizzare JSON.stringify ()


0

Può succedere per molte ragioni, ma probabilmente per un carattere non valido, quindi puoi usarlo JSON.stringify(obj);per trasformare il tuo oggetto in un JSON ma ricorda che si tratta di un'espressione JQUERY.


0

Ho questo errore PERCHÉ l'API che ha restituito l'oggetto json stava dando UN ERRORE (nel mio caso Code Igniter, restituisce un codice HTML quando il codice PHP fallisce), quindi NON È UN OGGETTO JSON.

Controlla le frasi SQL e il codice PHP e testalo con Postman (o qualche altro tester API)


0

L'errore che stavo facendo stava passando null (inconsapevolmente) in JSON.parse ().

Quindi ha gettato Unexpected token n in JSON at position 0


-24

Usa eval. Prende espressione / codice JavaScript come stringa e lo valuta / lo esegue.

eval(inputString);

Ogni invocazione di eval () crea una nuova istanza dell'interprete JavaScript. Questo può essere un porco di risorse.
Yëco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.