2013-07-29 11 views
21

Ho cercato e letto la maggior parte degli argomenti correlati, ma non erano quello che stavo cercando.php json_encode e jquery parseJSON problema di quotazione singola

Ho una stringa enocded JSON con funzione di json_encode PHP:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987} 

sto lavorando con jQuery per mettere i valori in campi appropriati anche, nel caso di test ho fatto il qui sotto:

<script> 
var obj = jQuery.parseJSON('<?=$data?>'); 
console.log(obj); 
</script> 

Supponiamo che $ data è questa:

$data = 
<<<END 
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987} 
END; 

che Google Chrome c onsole produce in questo caso:

Uncaught SyntaxError: Unexpected identifier 

Tuttavia quando faccio un cambiamento in JSON stringa codificata - aggiungendo rovesciare a singolo preventivo:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987} 

uscita Console è normalmente:

Object {casts: Array[3], year: 1987} 
casts: Array[3] 
year: 1987 

La domanda: è previsto questo errore nella console? Penso che sfuggire o sostituire ' con \' sarà così sporco!

AGGIORNATO

realtà dati $ valore deriva da una var json_encode($var) e $ è un array!

$data = json_encode($var); 

risposta

13

Tuttavia quando faccio un cambiamento in JSON stringa codificata - aggiunge Barra rovesciata di apice singolo

che sfugge nella stringa di PHP letterale. Viene quindi inserito nella stringa PHP come semplice '.

Se si vuole sfuggire prima di inserirlo nel JavaScript allora avete bisogno di aggiungere barre alla stringa che si ottiene fuori di json_encode (o meglio, dal momento che non si utilizza che (si dovrebbe essere!) Il JSON stringa che costruisci a mano).

Questo è più lavoro di cui hai bisogno però. La vera soluzione è da ricordare che JSON è un sottoinsieme della sintassi letterale JavaScript:

var obj = <?=$data?>; 
+0

La stringa json non è costruita a mano. vedere l'aggiornamento per favore. – revo

+7

+1 non c'è bisogno di analizzarlo - l'output di 'json_encode' è già valido JavaScript. – cmbuckley

+0

Sarebbe opportuno specificare 'JSON_HEX_TAG | JSON_HEX_AMP' però. Almeno il primo potrebbe essere necessario per soddisfare le [restrizioni per il contenuto degli elementi 'script'] (http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#restrictions -for-contents-of-script-elements), ed entrambi sono necessari se il documento può essere analizzato come XML. – PleaseStand

4

Il problema che si trovano ad affrontare è che si sta presentando i risultati della chiamata json_encode a JavaScript come una stringa che è da JavaScript valida . Rimuovi il set jQuery.jsonParse dall'output e assegna semplicemente i risultati echo alla variabile javascript in questione.

var obj = <?= json_encode(array("casts"=>array("Matthew Modine","Adam Baldwin","Vincent D'Onofrio"),"year"=>1987)); ?>; 
+0

per favore vedi il mio aggiornamento. – revo

+0

Il codice sopra funzionerà per voi ... mostra anche passando il passo jeexpress parseJson. – Orangepill

53

Per il problema più ampio di passare una stringa JSON-codificato in PHP (ad esempio, attraverso arricciatura), utilizzando l'opzione JSON_HEX_APOS è il modo più pulito per risolvere questo problema.Ciò risolverà anche il tuo problema, anche se le risposte precedenti sono corrette che non è necessario per chiamare parseJSON e l'oggetto JavaScript è lo stesso senza chiamare parseJSON su $data.

per il codice, si sarebbe solo effettuare questa modifica:

json_encode($var)-json_encode($var, JSON_HEX_APOS).

Ecco un esempio dei dati correttamente codificati essendo analizzati da jQuery: http://jsfiddle.net/SuttX/

Per ulteriore lettura, ecco un esempio dal PHP.net json_encode manual entry Esempio # 2:

$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9"); 

echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n"; 

Questo stamperà:

Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"] 

Un elenco completo di costanti JSON può essere trovato qui: PHP.net JSON constants

+7

Grazie! Questa soluzione funziona molto bene per me! –

+6

Soluzione impressionante e semplice! Salvato la mia vita 2 anni dopo. Grazie!! –

+1

Questa soluzione ha ancora 5 anni di garanzia. Mi hai salvato un sacco di tempo – bmatovu