2010-02-13 16 views
58

Estoy utilizando un objeto JS para crear gráficos con la visualización de Google. Estoy tratando de diseñar la fuente de datos. Al principio, creé un objeto JS en el lado del cliente.Cadena JSON al objeto 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); 

Ahora tengo que buscar los datos dinámicamente. Así que enviar una petición AJAX a una página que devuelve la cadena 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}]}" 

Este guardo en una variable:

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

y espectáculo como

alert(var1); 

Ahora mi tarea es para crear un objeto JS a partir de esta cadena. Esto no está funcionando. Cuando uso un objeto JS, todo funciona bien y puedo obtener mi gráfica requerida. Ahora bien, si intento poner el mismo valor de cadena de la solicitud AJAX que confirmé de un mensaje de alerta en un objeto n, el objeto no se está creando correctamente. Por favor, hágame saber su opinión y cualquier corrección o consejo.

+1

Utilice el método javascript 'eval (json_string)' para obtener la cadena al objeto json. Sin embargo, ten en cuenta que la misma función puede ser potencialmente peligrosa ya que también puede ejecutar scripts. –

+1

solo un FYI - Nombres y cadenas clave ** DEBEN ** estar dentro de '" 's en JSON válido: http://simonwillison.net/2006/Oct/11/json/ – gnarf

+0

posible duplicado de [Serialización a JSON en jQuery] (http://stackoverflow.com/questions/191881/serializing-to-json-in-jquery) – outis

Respuesta

118

Algunos navegadores modernos tienen soporte para analizar JSON en un objeto nativo:

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

Para los navegadores que no soportan, se puede descargar desde json2.js json.org para el análisis de seguridad de un Objeto JSON. La secuencia de comandos comprobará el soporte JSON nativo y, en caso de que no exista, proporcionará el objeto global JSON en su lugar. Si el objeto nativo más rápido está disponible, saldrá del script y lo dejará intacto. Sin embargo, debe proporcionar un JSON válido o arrojará un error —, puede verificar la validez de su JSON con http://jslint.com o http://jsonlint.com.

+4

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

5

Puede usar eval (jsonString) si confía en los datos de la cadena, de lo contrario tendrá que analizarlos correctamente - consulte json.org para ver algunos ejemplos de código.

+1

¿Puedo confiar en el contenido de la API de un gran sitio web (Reddit)? –

3

Puede usar this library de JSON.org para traducir su cadena en un objeto JSON.

var var1_obj = JSON.parse(var1); 

o puede utilizar la biblioteca jquery-json también.

var var1_obj = $.toJSON(var1); 
5

la cadena en su pregunta no es una cadena json válida. De json.org website:

JSON se basa en dos estructuras:

* 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. 

Básicamente una cadena JSON siempre comenzará con {o [.

Luego, como @Andy E y @Cryo dijeron que se puede analizar la cadena con json2.js u otras bibliotecas.

IMHO debe evitar eval porque lo hará con cualquier programa de javascript, por lo que puede incurrir en problemas de seguridad.

3

La cadena que está devolviendo no es válida JSON. Los nombres en los objetos necesitan ser citados y la cadena completa debe ponerse en { … } para formar un objeto.JSON tampoco puede contener algo como new Date(). JSON es solo un pequeño subconjunto de JavaScript que solo tiene cadenas, números, objetos, matrices, true, false y null.

Consulte el JSON grammar para obtener más información.

Cuestiones relacionadas