2010-02-13 15 views
58

Sto utilizzando un oggetto JS per creare grafici con visualizzazione Google. Sto cercando di progettare la fonte dei dati. Inizialmente, ho creato un oggetto JS lato client.Oggetto JSON da stringa a JS

var JSONObject = { 
    cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
     {id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
    {c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}] 
}; 

var data = new google.visualization.DataTable(JSONObject, 0.5); 

Ora ho bisogno di recuperare i dati in modo dinamico. Così mando una richiesta AJAX ad una pagina che restituisce la stringa JSON:

"cols: [{id: 'date', label: 'Date', type: 'date'}, 
{id: 'soldpencils', label: 'Sold Pencils', type: 'number'}, 
{id: 'soldpens', label: 'Sold Pens', type: 'number'}], 
    rows: [{c:[{v: new Date(2008,1,1),f:'2/1/2008'},{v: 30000}, {v: 40645}]}, 
     {c:[{v: new Date(2008,1,2),f:'2/2/2008'},{v: 14045}, {v: 20374}]}, 
{c:[{v: new Date(2008,1,3),f:'2/3/2008'},{v: 55022}, {v: 50766}]}" 

Questo mi salva in una variabile:

var var1 = "cols: [{i ....... 66}]}" 

e spettacolo come

alert(var1); 

Ora il mio compito è per creare un oggetto JS da questa stringa. Questo non funziona. Quando uso un oggetto JS, tutto funziona correttamente e sono in grado di ottenere il mio grafico richiesto. Ora, se provo a inserire lo stesso valore di stringa dalla richiesta AJAX che ho confermato da un messaggio di avviso in un n oggetto, l'oggetto non viene creato correttamente. Per favore fatemi sapere la vostra opinione e qualsiasi correzione o consiglio.

+1

Utilizzare il metodo javascript 'eval (json_string)' per ottenere una stringa sull'oggetto json. Attenzione però, la stessa funzione può essere potenzialmente pericolosa poiché può eseguire anche gli script. –

+1

solo una FYI - Nomi chiave e stringhe ** DEVE ** essere all'interno di '' ''s in JSON valido: http://simonwillison.net/2006/Oct/11/json/ – gnarf

+0

possibile duplicato di [Serializzazione a JSON in jQuery] (http://stackoverflow.com/questions/191881/serializing-to-json-in-jquery) – outis

risposta

118

Alcuni browser moderni hanno il supporto per l'analisi JSON in un oggetto nativo:

var var1 = '{"cols": [{"i" ....... 66}]}'; 
var result = JSON.parse(var1); 

Per i browser che non lo supportano, è possibile scaricare json2.js da json.org per l'analisi di sicurezza di un Oggetto JSON. Lo script controllerà il supporto JSON nativo e, se non esiste, fornirà invece l'oggetto globale JSON. Se è disponibile l'oggetto nativo più veloce, uscirà dallo script lasciandolo intatto. È necessario, tuttavia, fornire JSON valido o verrà generato un errore — è possibile verificare la validità del proprio JSON con http://jslint.com o http://jsonlint.com.

+4

Pertinente: http://caniuse.com/json – JamesHalsall

5

È possibile utilizzare eval (jsonString) se ci si fida dei dati nella stringa, altrimenti sarà necessario analizzarlo correttamente - controllare json.org per alcuni esempi di codice.

+1

Posso fidarmi del contenuto di l'API di un grande sito Web (Reddit)? –

3

È possibile utilizzare this library da JSON.org per tradurre la stringa in un oggetto JSON.

var var1_obj = JSON.parse(var1); 

oppure è possibile utilizzare la libreria jquery-json pure.

var var1_obj = $.toJSON(var1); 
5

la stringa nella tua domanda non è una stringa json valida. Da json.org website:

JSON è costruito su due strutture:

* A collection of name/value pairs. In various languages, this is 
    realized as an object, record, struct, dictionary, hash table, keyed list, or 
    associative array. 
* An ordered list of values. In most languages, this is realized as an 
    array, vector, list, or sequence. 

Fondamentalmente una stringa JSON sarà sempre iniziare con {o [.

Quindi come @Andy E e @Cryo hanno detto che è possibile analizzare la stringa con json2.js o alcune altre librerie.

IMHO si dovrebbe evitare eval perché sarà un qualsiasi programma javascript, quindi potresti incorrere in problemi di sicurezza.

3

La stringa che si sta restituendo non è JSON valida. I nomi negli oggetti devono essere citati e l'intera stringa deve essere inserita in { … } per formare un oggetto.JSON inoltre non può contenere qualcosa come new Date(). JSON è solo un piccolo sottoinsieme di JavaScript con solo stringhe, numeri, oggetti, matrici, true, false e null.

Vedere JSON grammar per ulteriori informazioni.