¿Cómo puedo convertir una cadena que describe un objeto en una cadena JSON usando JavaScript (o jQuery)?
por ejemplo: Convertir esto ( NO una cadena JSON válida):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
dentro de esto:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Me encantaría evitar usar eval()
si es posible.
javascript
json
object
snorpey
fuente
fuente
data
atributo, como este:<div data-object="{hello:'world'}"></div>
y no quiero usar comillas simples en el HTML (por lo que probablemente no sea de confianza)<div data-object='{"hello":"world"}'></div>
es HTML 100% válido (¿qué tienen que ver las comillas simples con confiar en él o no?). Si lo hace de esta manera, puedeJSON.parse
hacerlo y funcionará bien. Nota: las claves también deben ser citadas.<div data-object="{\"hello\":\"world\"}"></div>
. Si no desea utilizar un JSON válido en el atributo, deberá crear su propio formato y analizarlo usted mismo.Respuestas:
Si la cadena es de una fuente confiable , podría utilizar
eval
entoncesJSON.stringify
el resultado. Me gusta esto:Tenga en cuenta que cuando se
eval
trata de un objeto literal, debe estar entre paréntesis, de lo contrario, las llaves se analizan como un bloque en lugar de un objeto.También estoy de acuerdo con los comentarios bajo la pregunta de que sería mucho mejor codificar el objeto en un JSON válido para comenzar y evitar tener que analizar, codificar y luego presumiblemente analizarlo nuevamente . HTML admite atributos con comillas simples (solo asegúrese de codificar en HTML las comillas simples dentro de las cadenas).
fuente
eval
convierte la cadena en un objeto JavaScript (que funciona, siempre que la cadena represente JavaScript válido, incluso si no es JSON válido). LuegoJSON.stringify
convierte de un objeto a una cadena JSON (válida). Las llamadaseval
son peligrosas si la cadena no proviene de una fuente confiable porque literalmente podría ejecutar cualquier JavaScript que abre la posibilidad de ataques de secuencias de comandos entre sitios.Su cadena no es válida JSON, por lo que
JSON.parse
(o jQuery$.parseJSON
) no funcionará.Una forma sería usarlo
eval
para "analizar" el JSON "inválido" y luegostringify
"convertirlo" en JSON válido.Sugiero que, en lugar de intentar "arreglar" su JSON no válido, comience con un JSON válido en primer lugar. Cómo se
str
genera, debe fijarse allí, antes de que se genere, no después.EDITAR : Usted dijo (en los comentarios) que esta cadena se almacena en un atributo de datos:
Sugiero que lo arregles aquí, para que pueda ser
JSON.parse
d. Primero, tanto las claves como los valores deben ser entre comillas dobles. Debería verse así (los atributos con comillas simples en HTML son válidos):Ahora, solo puede usar
JSON.parse
(o jQuery's$.parseJSON
).fuente
jQuery.parseJSON
Editar. Esto se proporciona si tiene una cadena JSON válida
fuente
Use un código simple en el siguiente enlace:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
y revertir
fuente
Espero que esta pequeña función convierta una cadena JSON no válida en una válida.
Resultado
fuente
:
está en uno de los valores.Usar con precaución (por
eval()
):llamar como:
fuente
eval()
es la única forma de hacerlo. b) Advertí al OP al respecto. c) Mira la respuesta de Matthew Crumley y piensa en una mejor explicación. (Ah, yd) la afirmacióneval()
es mala no tiene sentido en esta forma generalizada.)eval("var x = " + str + ";")
que es totalmente válido JS. No necesitas hacervar x = ({a:12})
.json2.js
. No seas tan feliz como un gatillo.Descargo de responsabilidad: no intentes esto en casa, o para cualquier cosa que requiera que otros desarrolladores te tomen en serio:
Ahí lo hice.
Intenta no hacerlo aunque eval sea MALO para ti. Como se indicó anteriormente, use la cuña JSON de Crockford para navegadores más antiguos (IE7 y menos)
Este método requiere que su cadena sea javascript válido , que se convertirá en un objeto javascript que luego se puede serializar a JSON.
editar: arreglado como Rocket sugirió.
fuente
JSON.stringify(eval('('+str+')'));
, no es que lo apruebeeval
, pero su cadena no es JSON válida, por loJSON.parse
que no funciona.Puse mi respuesta para alguien que esté interesado en este viejo hilo.
He creado el HTML 5 * Data-analizador para jQuery plugin y de demostración que convierten una cadena JSON mal formado en un objeto sin necesidad de utilizar JavaScript
eval()
.Puede pasar los atributos de datos HTML5 * a continuación:
en el objeto:
fuente
Douglas Crockford tiene un convertidor, pero no estoy seguro de que ayude con JSON malo a JSON bueno.
https://github.com/douglascrockford/JSON-js
fuente
Hay una manera mucho más simple de lograr esta hazaña, solo secuestra el atributo onclick de un elemento ficticio para forzar el retorno de su cadena como un objeto JavaScript:
Aquí hay una demostración: http://codepen.io/csuwldcat/pen/dfzsu (abra su consola)
fuente
Debe usar "eval", luego JSON.stringify y luego JSON.parse al resultado.
fuente
Debe escribir corchetes, porque sin ellos
eval
considerará el código dentro de los corchetes como bloque de comandos.fuente
Su mejor y más segura apuesta sería JSON5 - JSON para humanos . Está creado específicamente para ese caso de uso.
fuente
Usar la nueva función () es mejor que evaluar, pero aún así solo debe usarse con una entrada segura.
Fuentes: MDN , 2ality
fuente
Para su ejemplo simple anterior, puede hacer esto usando 2 reemplazos regex simples:
Gran advertencia : este enfoque ingenuo supone que el objeto no tiene cadenas que contengan un carácter
'
o:
. Por ejemplo, no puedo pensar en una buena manera de convertir la siguiente cadena de objetos a JSON sin usareval
:fuente
Solo por las peculiaridades de esto, puedes convertir tu cadena a través de
babel-standalone
fuente
var str = "{hola: 'mundo', lugares: ['África', 'América', 'Asia', 'Australia']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")
console.log (JSON.parse (fStr))
Lo siento, estoy en mi teléfono, aquí hay una foto.
fuente
Una solución con una expresión regular y sin usar eval:
Creo que esto debería funcionar para varias líneas y todas las posibles ocurrencias (/ g flag) de 'string' entre comillas simples reemplazadas por "string" entre comillas dobles.
fuente
fuente
Quizás tengas que probar esto:
fuente