2010-06-30 18 views
11

Poiché il formato JSON specifica che le virgolette singole non devono essere sottoposte a escape, la maggior parte delle librerie (o anche il parser JSON nativo) non funzionerà se è presente una virgoletta singola con escape. Questo di solito non è un problema poiché la maggior parte delle volte si esegue un XHR che recupera alcuni dati formattati come JSON e si usa il responseText che contiene la stringa JSON che è quindi possibile analizzare, ecc.Come utilizzare una stringa letterale JSON?

In questa particolare situazione, Ho una stringa JSON memorizzata in un database come testo ... quindi il database contiene qualcosa come {"property":"value"} e voglio produrre questo come parte di una pagina HTML creata dal server in modo che il codice JavaScript in quella pagina assomigli a qualcosa del genere:

var x = '{"property":"value"}'; 

Ora, se la stringa JSON nel database contiene un apice singolo come questo:

{"property":"val'ue"} 

Poi ho bisogno di fuggire o altrimenti non sarò mai in grado di usarlo come una stringa:

console.clear(); 
var obj = {prop:"val'ue"}; 
var str = JSON.stringify(obj); 
console.log("JSON string is %s",str); 
console.dir(JSON.parse(str)); //No problem here 


//This obviously can't work since the string is closed and it causes an invalid script 
//console.dir(JSON.parse('{prop:"val'ue"}')); 

//so I need to escape it to use a literal JSON string 
console.dir(JSON.parse('{"prop":"val\'ue"}')); 

La domanda allora è il motivo per cui {"prop":"val\'ue"} non considerati come una stringa JSON valida?

+0

quindi, qual è il problema con 'console.dir (JSON.parse ('{" prop ":" val \' ue "} '))'? funziona per me (cromo) – mykhal

+0

Giusto funziona, la mia domanda era più perché considerava JSON {"prop" non valido: "valu \ 'ue"} (secondo le specifiche) quando in una situazione come quella che descrivo è necessario per avere questo nella tua stringa. Questo mi costringe ora a rielaborare una stringa JSON già codificata. – SBUJOLD

risposta

4

In JavaScript - la stringa '{"prop":"val\'ue"}' è un corretto modo per codificare il JSON come una stringa letterale .

Poiché l'interprete JavaScript legge la stringa con quotatura singola, converte lo \' in '. Il valore della stringa è {"prop":"val'ue"} che è JSON valido.

Al fine di creare il malato stringa JSON , si dovrebbe scrivere '{"prop":"val\\\'ue"}'

Se ho capito la domanda giusta, si sta tentando di generare il codice JavaScript che imposterà una variabile per la versione decodificata di un Stringa JSON memorizzata nel database. Quindi ora stai codificando nuovamente la stringa, in quanto il modo per ottenere questa stringa in JavaScript consiste nell'utilizzare una stringa letterale, passandola attraverso JSON.parse(). Probabilmente si può fare affidamento sull'utilizzo dell'encoder JSON lato server per codificare la stringa JSON come stringa letterale JavaScript. Per esempio:

<?php $jsonString = '{"prop":"val\'ue"}'; ?> 
var myJson = JSON.parse(<?php echo json_encode($jsonString) ?>); 
// Prints out: 
// var myJson = JSON.parse("{\"prop\":\"val'ue\"}"); 
// And results: Object - { prop: "val'ue"} 

Tuttavia, se si è sicuri al 100% il JSON sta per essere valida, e non è necessario il peso del controllo di analisi/errore in più - si potrebbe saltare tutto ciò che la codifica in più e basta scrivere:

var myJson = <?php echo $jsonString; ?> 

Ricordare, JSON è la sintassi JavaScript valida per la definizione degli oggetti dopo tutto!

+1

Thx, ho sicuramente preso il pensiero sbagliato, il migliore è sicuramente ricodificarlo come dici tu, in questo modo il l'interprete javaScript memorizzerà il valore stringa "interpretato", causando il VALORE della variabile come stringa JSON valida. – SBUJOLD

+0

@SBUJOLD - nessun problema :) felice di poterti indirizzare sulla giusta via! – gnarf

+1

+1 Buona spiegazione. – amelvin

2

Secondo jsonlint è valida senza sfuggire alla sola citazione, quindi questo va bene:

{"prop": "val'ue"} 

Ma questo non è valido:

{"prop":"val\'ue"} 

Secondo json.org JSON:

è completamente indipendente dalla lingua ma utilizza le convenzioni che sono miliar di programmatori della C-famiglia di lingue, tra cui C, C++, C#, Java, JavaScript, Perl, Python, e molti altri

Così è le convenzioni linguistiche in lingue di tipo C riguardo il reverse solidus (\) significa che il tuo esempio non è valido.

+0

+1 questo sicuramente risponde al "Perché è' \ ''non valido nelle stringhe JSON" parte della domanda – gnarf

1

Si potrebbe provare quanto segue, tuttavia, è brutto.

JSON.parse("{\"obj\":\"val'ue\"}");

O semplicemente memorizzare la stringa in un var prima. Questo non dovrebbe memorizzare il valore letteral backslash e quindi il parser JSON dovrebbe funzionare.


var str = '{"obj" : "val\'ue"}'; 
JSON.parse(str); 

Problemi correlati