2009-06-04 11 views
42

Un doppio preventivo anche se il file di escape genera un errore di analisi.
un'occhiata al codice qui sottoerrore di analisi json con virgolette

//parse the json in javascript 
var testJson = '{"result": ["lunch", "\"Show\""] }'; 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 

Questo sta gettando errore di analisi a causa delle virgolette doppie (che sono già sfuggiti).
Anche eval() non funzionerà qui.
Ma se scappo con doppie barre in questo modo:

var result = '{"result": ["lunch", "\\"Show\\""] }'; 
var tags = JSON.parse(result); 
alert (tags.result[1]); 

poi funziona benissimo.
Perché dobbiamo usare la doppia barra qui in javascript? Il problema è che la funzione PHP json_encode() esegue il escape di una virgoletta doppia con una singola barra (come questa: \"show\") che JSON.parse non sarà in grado di analizzare. Come gestisco questa situazione?

+1

var eval ('(' + risultato + ')'); – Priya

risposta

29

Bene, infine, l'analisi di JSON utilizza la stessa valutazione, quindi non vi è alcuna differenza quando si dà loro smth. con sintassi errata. In questo caso è necessario sfuggire correttamente le citazioni in php, per poi fuggire e la loro fuga barre con json_encode

<?php 
    $json = '{"result": ["lunch", "\"Show\""] }'; 
    echo json_encode($json); 
?> 

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }" 

Questo dovrebbe funzionare sul lato client JS (se ho fatto errori di battitura).

+1

Ma questa è una cosa che dovrebbe essere gestita dalla funzione json_encode(). Perché restituisce qualcosa che non può essere analizzato correttamente da JSON.parse(). – Varun

+0

Significa che php_encode() è bacato .. ?? – Varun

+7

Non è un bug in json_encode (presumo che sia quello che intendevi). json_encode non è inteso per creare valori letterali stringa JavaScript, quindi non esegue l'escape aggiuntivo. –

33

JavaScript scodella le stringhe e JSON disimpedisce anche loro. la prima stringa ('{"result": ["lunch", "\"Show\""] }') è vista dal parser json come {"result": ["lunch", ""Show""] }, perché \" in javascript significa ", ma non esce dalla stringa doppia citata.

La seconda stringa '{"result": ["lunch", "\\\"Show\\\""] }' viene visualizzata per prima cosa senza escape su {"result": ["lunch", "\"Show\""] } (e che JSON non ha correttamente sostituito).

Penso che anche lo '{"result": ["lunch", "\\"Show\\""] }' debba funzionare.

+5

+1 Questa è in realtà la risposta giusta – Christian

8

Dal docs

JSON_HEX_APOS (intero) All 'vengono convertiti a \ u0027
JSON_HEX_QUOT (intero) All "vengono convertiti a \ u0022

json_encode() prende due args, il valore e le opzioni Quindi prova

json_encode($result, JSON_HEX_QUOT); // or 
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS); 

Non ho t ried questo però.

+1

Avviso: json_encode() si aspetta esattamente 1 parametro, 2 dato in ... –

+1

Si sta utilizzando una versione di PHP precedente alla 5.3.0, come indicato dai documenti. – raylu

+0

Questa è la risposta, ma avrebbe dovuto essere il comportamento predefinito che inizia con – nus

2

Spegnere magic_quotes_gpc in php.ini.

10

Questo problema è causato dal meccanismo di escape di due stringhe: uno proviene da JS e uno proviene da JSON.

Una combinazione del carattere barra rovesciata combinata con un altro carattere successivo viene utilizzata per rappresentare un carattere che non è altrimenti rappresentabile all'interno della stringa. '' \\ '' sta per '\' ecc.

Questo meccanismo di escape si verifica prima che JSON.parse() funzioni.

per esempio,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}'); 
console.log(parsedObj.sentence); 
>>>"It is one backslash(\)" 

Dal punto di vista del generatore di stringa, passa quattro contraccolpi '\' nel interprete JavaScript.

Dal punto di vista dell'interprete JavaScript, interpreta ci sono due backlashes (\) poiché ogni sequenza "\\" verrà interpretata come una "\".

Dal punto di vista del parser JSON, lo riceve due backlashes (\\) e le regole di escape della stringa JSON lo analizzeranno come un singolo '\' che è il risultato di output.

spiegare primo codice:

var testJson = '{"result": ["lunch", "\"Show\""] }'; 
//The real string after sequence escaping in to JS is 
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse. 
//Thus, it breaks the JSON grammar and generates an error 
var tags = JSON.parse(testJson); 
alert (tags.result[1]); 
+2

+1 per la spiegazione dettagliata – Izkata

1

php per JavaScript Object (php> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');