2010-08-13 10 views
25

Quiero convertir a continuación una cadena en una matriz en javascript.¿La mejor manera de convertir una cadena a una matriz de objetos en javascript?

{a:12, b:c, foo:bar} 

¿Cómo convierto esta cadena en una matriz de objetos? ¿Alguna idea genial?

+2

¿Cómo sería esta matriz? –

+1

Eso se parece mucho a JSON. Eso ya es muy parecido a una matriz asociativa y se puede acceder como tal. ¿Estás consciente de esto? [Mira aquí] (http://www.hunlock.com/blogs/Mastering_JSON_ (_JavaScript_Object_Notation_% 29). – BalusC

+0

No es una matriz. Es una sola cadena. Acabo de recibir esta cadena del atributo de etiqueta. Y quiero convertir esto string a una matriz. – Zeck

Respuesta

74

creo que la mejor manera de hacer esto, como Douglas Crockford (uno de los gurús de biggests JavaScript) suggests in here es mediante el JSON native parser, ya que no sólo es más rápido que la función eval(), también es más seguro.

nativo JSON analizador ya está disponible en:

  • Firefox 3.5 +
  • IE 8+
  • Opera 10.5 +
  • Safari Safari 4.0.3+
  • Chrome (no hacer saber qué versión)

Y Crockford ha hecho una reserva segura en javascrip t, llamado json2.js, que es una adaptación del enfoque eval(), con algunos bits de seguridad agregados y con la API nativa de los analizadores JSON. Solo necesita incluir ese archivo, eliminar su primera línea y usar el analizador nativo JSON, y si no está presente, json2 haría el trabajo.

Aquí se muestra un ejemplo:

var myJSONString = '{ "a": 1, "b": 2 }', 
    myObject = JSON.parse(myJSONString); 

Una vez analizado sintácticamente obtendrá un objeto con atributos a y b, y como ustedes saben, se puede tratar de un objeto como una tabla hash o associative array en JavaScript, por lo que sería capaz de acceder a los valores de la siguiente manera:

myObject['a']; 

Si lo que desea es una matriz simple y no una asociativo que podría hacer algo como:

var myArray = []; 
for(var i in myObject) { 
    myArray.push(myObject[i]); 
} 

Por último, aunque no es necesario en JavaScript, el JSON spec requiere una doble cita de la clave de los miembros. Entonces, el analizador de Navite no funcionará sin él. Si yo fuera tú, lo agregaría, pero si no es posible usa el enfoque var myObject = eval("(" + myString + ")");.

+0

¿Qué significa var myObject = e? val ("(" + myString + ")"); ¿media? Muchas gracias. – MEM

+1

eval() analiza una cadena como origen de JavaScript, y como todos los JSON válidos también son JavaScript válidos (y provienen de la notación de objetos de JavaScript), puede usar eval() para transformarlo a su representación de JavaScript. Es una práctica común agregar padres al principio y al final de la cadena por razones de seguridad, aunque el uso de eval() es bastante inseguro. Entonces, var myObject = eval ("(" + myString + ")"); solo está analizando el myString JSON y obteniendo su valor en la variable myObject (probablemente un objeto o matriz) – alcuadrado

+0

Tenga en cuenta que json2 todavía usa eval, pero realiza algunas comprobaciones para mitigar las posibles vulnerabilidades –

7

La forma más simple, pero insegura de hacerlo es:

eval('(' + myJSONtext + ')') 

Pero como esto va a interpretar cualquier código JavaScript, que tiene agujeros de seguridad. Para protegerse contra esto, use un analizador json. Si está utilizando un marco (jquery, mootools, etc.) hay una llamada específica del marco. La mayoría de ellos se basan en el analizador de Douglas Crawford disponible en http://www.json.org/js.html.

2

puede utilizar "en el"

var myObject = {a:'12', b:'c', foo:'bar'}; 
var myArray = []; 

for(key in myObject) { 
    var value = myObject[key]; 
    myArray[key] = value; 
} 

myArray['a']; // returns 12 

Notas: teniendo en cuenta que myObject sólo tienen un nivel de pares de valores clave.

+0

Si realmente desea utilizar una cadena, cambie la primera línea a var myObject = eval ('(' + "{a: '12 ', b:' c ', foo:' barra '}" +') ') ;, usando @Rob tip. – Topera

+0

sí, gracias. – Zeck

1

Si está utilizando jQuery, está la función $.parseJSON().Lanza una excepción si la cadena está mal formada, y "Además, si pasa nada, una cadena vacía, nula o indefinida, 'null' será devuelta por parseJSON. Donde el navegador proporciona una implementación nativa de JSON.parse, jQuery lo usa para analizar la cadena "

7

Dado que su cadena es malformada JSON, un analizador JSON no puede analizarlo correctamente e incluso eval() lanzará un error. Tampoco es un Array, sino un HashMap o simplemente un Object literal (malformado). Si el literal del objeto solo contendrá valores numéricos y de cadena (y ningún objeto/matriz hijo) puede usar el siguiente código.

function malformedJSON2Array (tar) { 
    var arr = []; 
    tar = tar.replace(/^\{|\}$/g,'').split(','); 
    for(var i=0,cur,pair;cur=tar[i];i++){ 
     arr[i] = {}; 
     pair = cur.split(':'); 
     arr[i][pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1]; 
    } 
    return arr; 
} 

malformedJSON2Array("{a:12, b:c, foo:bar}"); 
// result -> [{a:12},{b:'c'},{foo:'bar'}] 

Ese código convertirá su cadena en una matriz de objetos (plural).

Sin embargo, si en realidad quería un HashMap (matriz asociativa) y no una matriz, utilice el siguiente código:

function malformedJSON2Object(tar) { 
    var obj = {}; 
    tar = tar.replace(/^\{|\}$/g,'').split(','); 
    for(var i=0,cur,pair;cur=tar[i];i++){ 
     pair = cur.split(':'); 
     obj[pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1]; 
    } 
    return obj; 
} 

malformedJSON2Object("{a:12, b:c, foo:bar}"); 
// result -> {a:12,b:'c',foo:'bar'} 

El código anterior será mucho más complejo cuando se inicia objetos de anidación y matrices. Básicamente, tendría que volver a escribir JSON.js y JSON2.js para admitir JSON con formato incorrecto.

Considere también la siguiente opción, que todavía es mala, lo admito, pero marginalmente mejor que pegar JSON dentro de un atributo de etiqueta HTML.

<div id="DATA001">bla</div> 
<!-- namespacing your data is even better! --> 
<script>var DATA001 = {a:12,b:"c",foo:"bar"};</script> 

Te estoy asumiendo omiten las comillas en la cadena, ya que ha ponerlo dentro de un atributo de una etiqueta HTML y no quería escapar comillas.

+0

+1 para darse cuenta de que la cadena no es correcta JSON –

0

JSON.parse hará el truco. Una vez analizado, puede insertarlos en la matriz.

var object = JSON.parse(param); 
var array = []; 
for(var i in object) { 
    array.push(object[i]); 
} 
Cuestiones relacionadas