2010-06-10 28 views
7

¿Cómo puedo convertir una cadena JSON a un objeto en JavaScript? ¿Hay algún método que haga esto?¿Cómo convertir una cadena JSON a un objeto?

Algo así como:

var x = "{ id: 5, name: 'hello' }"; 
var y = /*something*/(x); 

alert(y.id + " " + y.name); 
+0

sin o sin marcos (jQuery, etc.)? – kennytm

+0

(Y, por favor, no 'eval'.) – kennytm

+0

jQuery hace eso? ¿Cómo? – BrunoLM

Respuesta

9

Según los comentarios y el historial de preguntas, parece que ya está utilizando jQuery. En ese caso, es bueno saber que jQuery se envía con una nueva función parseJSON() desde version 1.4.1 que se lanzó a finales de enero de este año. Considere actualizar si todavía no está en 1.4.1. He aquí un extracto de la relevancia de su documentación de la API:

Descripción: Toma una cadena JSON bien formada y devuelve el objeto resultante JavaScript.

jQuery.parseJSON (JSON) versión ha añadido: 1.4.1

JSON La cadena JSON para analizar.

Al pasar una cadena JSON malformada se producirá una excepción. Por ejemplo, los siguientes son todas las cadenas JSON malformados:

  • {test: 1} (prueba no tiene comillas dobles alrededor de ella).
  • {'test': 1} ('test' usa comillas simples en lugar de comillas dobles).

Además, si no pasa nada, se devolverá una cadena vacía, nula o indefinida, 'nulo' de parseJSON. Cuando el navegador proporciona una implementación nativa de JSON.parse, jQuery lo usa para analizar la cadena. Para detalles sobre el formato JSON, vea http://json.org/.

Ejemplo:

analizar una cadena JSON.

var obj = jQuery.parseJSON('{"name":"John"}'); 
alert(obj.name === "John"); 
+0

BalusC: No eliminaré la etiqueta 'jquery', pero para referencia futura, las etiquetas son para la * pregunta *, no para las respuestas. La pregunta no reduce las opciones de jQuery, incluso si está abierto a jQuery. De las 6 respuestas, la tuya fue la única relacionada con jQuery. Básicamente, esta no es una pregunta jQuery y no debe etiquetarse como tal. – Blixt

0

La página web JSON.org da la solución más simple:

var y = eval('(' + x + ')'); 

More information

Editar: Oh. Derecha. La solución eval es buena si y solo si está seguro de que puede confiar en que la fuente producirá los objetos JSON correctos. De lo contrario, tendrá que usar un analizador JSON: mire las otras respuestas.

+0

Lento. Nada más que decir. – bezmax

+1

@Max: XSS. ____ – kennytm

+0

@KennyTM: Sí, se olvidó de eso. Nunca utilizo eval de todos modos ... – bezmax

1

Este párrafo cubre totalmente las implementaciones nativas de JSON, y las bibliotecas que utilizan implementaciones nativas de JSON: http://en.wikipedia.org/wiki/JSON#Native_JSON

que utilicen la implementación JSON nativo será considerablemente más rápido/más seguro que usar algunas bibliotecas de JavaScript para una misma tarea. Sin embargo, si alguna biblioteca afirma que intentará usar la implementación nativa siempre que sea posible, es una mejor opción que usar JSON nativo directamente (compatibilidad y otras cosas).

0

también se puede hacer lo siguiente, que es ligeramente menos mal que eval :):

var x = '{ "id": 5, "name": "hello" }'; 

var y = new Function("return " + x)(); 
alert(y.id + " " + y.name); 

aunque como se dijo por otros, si estás usando jQuery, ir a por el parseJSON incorporado método.

+0

Bueno, supongo que esto es tan peligroso como 'eval' – BrunoLM

+0

Bruno - los mecanismos debajo de las cubiertas son diferentes y si miras el código jquery, puedes ver algo parecido a esto en esa función (parseJSON: function (un)). vea el extracto a continuación para la función jquery de la fuente ... –

2

Bruno,

aquí está el método de jQuery, que como se verá, utiliza el mismo auto nueva función ("retorno ..) negocio.

parseJSON: function (a) { 
    if (typeof a !== "string" || !a) return null; 
    if (/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") 
     .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") 
     .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) 
     return z.JSON && z.JSON.parse ? z.JSON.parse(a) : (new Function("return " + a))(); 
    else c.error("Invalid JSON: " + a) 
} 

[editar] la expresión regular es, por supuesto 'tratar' con cualquier carácter delincuentes incrustados dentro del ther cadena JSON.

aunque espeluznante :)

+0

pero usa JSON.parse donde esté disponible, que definitivamente es una buena cosa (tm). Sin el objeto JSON, apenas hay una forma mejor de hacer la conversión, ya que hacer un analizador JSON completo en JavaScript seguramente daría como resultado algo más lento que eval –

+0

ammoQ - sí, absolutamente. simplemente me alegro de que no usaron el método eval como la mente de retorno :) –

+0

Es seguro porque la expresión regular, +1 para apuntarlo – BrunoLM

Cuestiones relacionadas