2015-06-30 16 views
8

Quello che sto cercando di fare è semplice. Analizza questo array tenendo oggetti json in un array Javascript.Perché JavaScript non può analizzare questo array JSON da una stringa letterale?

var merchantsJson = JSON.parse('[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\u0022\u003C/div\u003E"}]'); 

Ma il carattere unicode \ u003C sembra rompere il parser. Nella console di Chrome vedo "Uncaught SyntaxError: Token imprevisto <"

Un po 'più di informazioni. Quanto sopra è a cosa viene valutato il codice. In realtà il codice contiene un'espressione jsp.

var merchantsJson = JSON.parse('${jsonArr}'); 

Se rimuovo le virgolette singole, non c'è problema, ma eclissi mi danno un messaggio di errore "manca il punto e virgola". È possibile analizzare l'array con le virgolette come sto cercando di fare?

+0

Si ottengono molte risposte simili al commento di Juhana, ma si noti che JSON non è in realtà un sottoinsieme di JavaScript. Esistono casi limite in cui JSON valido non verrà analizzato correttamente da un interprete javascript che si verifica quando si lavora con Unicode: http://stackoverflow.com/questions/23752156/are-all-json-objects-also- valid-javascript-objects - fai attenzione con questo consiglio –

+0

@AaronDufour Sono abbastanza sicuro che l'ispettore JSON di JSP sia in grado di gestire tali casi, considerando che è progettato per avere il suo output inserito "così com'è" per il codice JS. – JJJ

+0

@Juhana Non ho familiarità con l'identificatore JSON di JSP, quindi ho pensato che un avvertimento generale fosse giustificato. Se ci si può fidare di '\ u' codificare i caratteri fastidiosi, allora non ci sarà alcun problema. –

risposta

3

Non è a causa di \ u003C, piuttosto il carattere \u0022 causa il problema, poiché è una virgoletta e JavaScript considera letteralmente la fine della stringa.

È necessario sfuggire a tale personaggio: \\u0022.

+0

'\ u0027' non è il problema; '\ u0022' è. –

+1

Sì, entrambi possono essere il problema a seconda di come si avvia la stringa. – AlejandroC

+3

@AlejandroC: No, solo il doppio preventivo è il problema. Non importa quali frasi stai usando nella stringa letterale perché è già una sequenza di escape, quindi non spezzerà la stringa principale. –

6

Provare a sostituire \u con \\u. In caso contrario, il parser JSON riceve Unicode già decodificato, che ha creato JSON inquinato.

+4

C'è qualcosa di sbagliato in * decodificato Unicode * in JSON ... in infatti richiede Unicode. L'unico vero problema è che un carattere rappresenta una virgoletta doppia, che chiude la * "sottostringa" * che il parser sta interpretando. Questo è l'unico che ha bisogno di fuggire. –

8

Perché c'è un extra " nella stringa letterale che è codificato da \u0022:

> '[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\u0022\u003C/div\u003E"}]' 
[{"id":61693,"name":"Más"},{"id":61690,"name":"'"</div>"}] 

In breve, la vostra JSON nella stringa non è valido. Si avrebbe bisogno di fuggire le sequenze di escape Unicode per le virgolette nella stringa letterale ("'\u0022</div>"), utilizzando

JSON.parse('[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\\u0022\u003C/div\u003E"}]' 
//                ^

o sfuggire il carattere preventivo ("'\"</div>"):

JSON.parse('[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\\\u0022\u003C/div\u003E"}]'); 
//                ^^ 

Tuttavia, non v'è in realtà non c'è bisogno di usare JSON affatto. Basta uscita una matrice JS letterali nel codice:

var merchantsJson = ${jsonArr}; 
+0

Volevo solo notare che l'extra '\ nell'ultimo esempio di parsing non è realmente necessario poiché anche JSON interpreterà la sequenza di escape. Funziona in entrambi i casi, ho pensato di parlarne. –

+0

@squint: Sì, è come la prima soluzione :-) Forse avrei dovuto usare '\\\" 'per maggiore chiarezza – Bergi

+0

Sì, tranne che evita inutilmente le virgolette singole, che non hanno alcun significato speciale per JSON , quindi quelli potrebbero essere ricevuti dal parser come caratteri di citazione effettivi invece di sequenze di escape. Ancora una volta, solo notandolo per le persone perché questa roba di escape può essere confusa.E 'tutto buono e tutto funziona. :-) –

11

L'interpolazione di ${jsonArr} è già un oggetto JavaScript. Quando lo avvolgi in '${jsonArr}' questo lo trasforma in una stringa e devi usare JSON.parse.

Non c'è bisogno di renderlo una stringa. Puoi semplicemente fare var merchantsArray = ${jsonArr}. I costrutti JSON sono già interoperabili con il codice JavaScript.

+3

Eclipse si lamenterà che non è un JavaScript legale, ma c'è da aspettarselo perché non è JavaScript, è un modello che produrrà JavaScript – ikegami

+2

Questa è la risposta corretta: tutti gli altri stanno trattando i sintomi, non la causa – JJJ

+4

@Juhana, Questo è un risposta corretta se il JSON è attendibile e se è effettivamente JS legale ([che non tutto JSON è] (http://stackoverflow.com/questions/23752156/are-all-json-objects-also-valid-javasc Ript-oggetti)). Se non è attendibile, la risposta corretta è convertire correttamente il JSON in una stringa JS letterale, che è ciò che le altre risposte suggeriscono (o che provano a). Non sono, come dici tu, curando i sintomi. – ikegami

Problemi correlati