SintassiErrore: token imprevisto o in JSON in posizione 1


139

Analizzo alcuni dati usando una classe di tipo nel mio controller. Ricevo i dati come segue:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

Ho provato a memorizzare i dati in questo modo

var userData = _data;
var newData = JSON.parse(userData).data.userList;

Come posso estrarre l'elenco utenti in una nuova variabile?


11
Potrebbe non essere necessario utilizzare JSON.parse. Prova a utilizzare userDatadirettamente come oggetto.
Mohit Bhardwaj,

13
Se console.log(typeof userData)mostra objectallora hai già un oggetto javascript e non una stringa JSON che devi analizzare.
t.niese,

1
@MohitBhardwaj sì, non è necessario per l'analisi ..
Soniya Mohan

5
Di solito ogni volta che ricevi questo errore Unexpected token o in JSON, molto probabilmente stai cercando di analizzare un oggetto che è già in forma analizzata.
Mohit Bhardwaj,

@MohitBhardwaj okay!
Soniya Mohan,

Risposte:


191

Il JSON che hai pubblicato sembra a posto, tuttavia nel tuo codice, molto probabilmente non è più una stringa JSON, ma già un oggetto JavaScript. Ciò significa che non è necessario più l'analisi.

Puoi testarlo tu stesso, ad esempio nella console di Chrome:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()converte l'input in una stringa. Il toString()metodo degli oggetti JavaScript per impostazione predefinita restituisce [object Object], con conseguente comportamento osservato.

Prova invece quanto segue:

var newData = userData.data.userList;

1
Quindi è applicabile a tutti i tipi di browser?
comeOnGetIt

@Timo Potresti cercare questo link.
V SH,

A volte questo errore può emergere quando l'endpoint dell'API URL che serve la richiesta presenta un errore nel suo codice o qualche altro file incluso o utilizzato e genera un errore che non viene gestito o annotato. Per lo più puoi ottenerlo se guardi la scheda di rete negli strumenti di sviluppo del browser o puoi colpire l'endpoint usando post man e vedere cosa succede.
MuturiAlex

65

i primi parametri della funzione JSON.parsedovrebbero essere una stringa e i tuoi dati sono un oggetto JavaScript, quindi verranno convertiti in una stringa [object object], devi usarli JSON.stringifyprima di passare i dati

JSON.parse(JSON.stringify(userData))

1
Ottimo aiuto fratello. Grazie :)
Anand_5050

Ha aiutato. Grazie per la soluzione.
Nag Arjun,

Mi hai salvato la giornata fratello. Grazie :)
Dwarkesh Soni il

questo non funzionerà quando la stringa contiene una doppia virgoletta hai qualche soluzione
Mr S Coder

23

Non usare mai JSON.parsesenza avvolgerlo in try-catchblocco:

// payload 
let userData = null;

try {
    userDate = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
Questo in realtà non risponde alla domanda, ma commenta la mancanza di gestione delle eccezioni.
Richard Duerr,

2
@RichardDuerr, ma questo aiuterà a correggere l'errore dell'argomento principale. ie SyntaxError: token imprevisto o in JSON in posizione 1
Niko Jojo,

6
Ciò nasconde semplicemente l'errore, ma in realtà non lo risolve.
Richard Duerr,

21

Appena sopra JSON.parse, usa:

var newData = JSON.stringify(userData)

4
JSON.stringify()converte un oggetto JavaScript in una rappresentazione in forma di stringa, che è l'opposto di ciò che JSON.parse()fa. Stavi ottenendo il SyntaxErrorperché stavi cercando di analizzare qualcosa che era già un oggetto. Nella soluzione di @ Sukhchain, viene evitato in una stringa per evitarlo.
Hubert,

1
Il rovescio della medaglia è che alla fine stai usando JSON.parse()troppo ridondante. Anche se è un processo piuttosto veloce, l'analisi di JSON viene eseguita in modo sincrono e può potenzialmente bloccare l'interfaccia utente, quindi sconsiglio di utilizzarlo. Invece, è possibile verificare se la variabile è un oggetto, ad esempio utilizzando typeof(userData) === 'object'prima di tentare di analizzarlo.
Hubert,

2

Beh, volevo dire che ho bisogno di analizzare oggetto come questo: var jsonObj = {"first name" : "fname"}. Ma in realtà non lo so. Perché è già un JSON.


2

Possiamo anche aggiungere controlli come questo:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

1

L'errore "O" imprevisto viene generato quando si analizzano dati JSON o String.

Se è una stringa, è già una stringa. L'analisi termina con errore "O" imprevisto.

Ho affrontato simili (anche se in un contesto diverso), ho risolto il seguente errore rimuovendo JSON Producer.

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

La risposta contiene il ritorno di stringa "OK" . L'annotazione contrassegnata come @Produces ({** MediaType.APPLICATION_JSON }) ** tenta di analizzare la stringa nel formato JSON che risulta in 'O' imprevista .

La rimozione di @Produces ({ MediaType.APPLICATION_JSON }) funziona correttamente . Uscita: OK

Attenzione: inoltre, sul lato client, se si effettua una richiesta Ajax e si utilizza JSON.parse ("OK"), genera un token imprevisto 'O'

O è la prima lettera della stringa

JSON.parse (oggetto) si confronta con jQuery.parseJSON (oggetto);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); --- Funziona bene

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.