javascript - print - Convertir cadena de objetos a JSON
json serialize javascript (19)
Descargo de responsabilidad: no intente esto en casa, o para cualquier cosa que requiera que otros desarrolladores lo tomen en serio:
JSON.stringify(eval(''('' + str + '')''));
Ahí, lo hice.
Intenta no hacerlo aunque, eval sea MALO para ti. Como se mencionó anteriormente, utilice la cuña JSON de Crockford para navegadores más antiguos (IE7 y anteriores)
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 sugirió Rocket.
¿Cómo puedo convertir una cadena que describe un objeto en una cadena JSON usando JavaScript (o jQuery)?
por ejemplo: Convertir esto ( NO es 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 el uso de eval()
si es posible.
Douglas Crockford tiene un convertidor, pero no estoy seguro de que ayude con el mal JSON al buen JSON.
Espero que esta pequeña función convierta una cadena JSON no válida a una válida.
function JSONize(str) {
return str
// wrap keys without quote with valid double quote
.replace(/([/$/w]+)/s*:/g, function(_, $1){return ''"''+$1+''":''})
// replacing single quote wrapped ones to double quote
.replace(/''([^'']+)''/g, function(_, $1){return ''"''+$1+''"''})
}
Resultado
var invalidJSON = "{ hello: ''world'',foo:1, bar : ''2'', foo1: 1, _bar : 2, $2: 3, ''xxx'': 5, /"fuz/": 4, places: [''Africa'', ''America'', ''Asia'', ''Australia''] }"
JSON.parse(invalidJSON)
//Result: Uncaught SyntaxError: Unexpected token h VM1058:2
JSON.parse(JSONize(invalidJSON))
//Result: Object {hello: "world", foo: 1, bar: "2", foo1: 1, _bar: 2…}
Hay una manera mucho más simple de lograr esta hazaña, solo apropiarse del atributo onclick de un elemento ficticio para forzar el retorno de la cadena como un objeto JavaScript:
var jsonify = (function(div){
return function(json){
div.setAttribute(''onclick'', ''this.__json__ = '' + json);
div.click();
return div.__json__;
}
})(document.createElement(''div''));
// Let''s say you had a string like ''{ one: 1 }'' (malformed, a key without quotes)
// jsonify(''{ one: 1 }'') will output a good ol'' JS object ;)
Aquí hay una demostración: http://codepen.io/csuwldcat/pen/dfzsu (abra su consola)
Para su simple ejemplo anterior, puede hacer esto usando 2 reemplazos de expresiones regulares simples:
var str = "{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }";
str.replace(/(/w+):/g, ''"$1":'').replace(/''/g, ''"'');
=> ''{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }''
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 forma de convertir la siguiente cadena de objetos a JSON sin usar eval
:
"{ hello: ''world'', places: [/"America: The Progressive''s Nightmare/"] }"
Puse mi respuesta para alguien que está interesado en este viejo hilo.
Creé el analizador de datos HTML5 * para jQuery plugin y demo que convierten una cadena JSON malformada en un objeto JavaScript sin usar eval()
.
Puede pasar los atributos de datos HTML5 * a continuación:
<div data-object=''{"hello":"world"}''></div>
<div data-object="{hello:''world''}"></div>
<div data-object="hello:world"></div>
en el objeto:
{
hello: "world"
}
Quizás tengas que probar esto:
str = jQuery.parseJSON(str)
Solo por las peculiaridades de esto, puedes convertir tu cadena a través de babel-standalone
var str = "{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }";
function toJSON() {
return {
visitor: {
Identifier(path) {
path.node.name = ''"'' + path.node.name + ''"''
},
StringLiteral(path) {
delete path.node.extra
}
}
}
}
Babel.registerPlugin(''toJSON'', toJSON);
var parsed = Babel.transform(''('' + str + '')'', {
plugins: [''toJSON'']
});
var json = parsed.code.slice(1, -2)
console.log(JSON.parse(json))
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
Su cadena no es JSON válida, por lo que JSON.parse
(o $.parseJSON
jQuery) no funcionará.
Una forma sería usar eval
para "analizar" el JSON "inválido" y luego stringify
para "convertirlo" a JSON válido.
var str = "{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }"
str = JSON.stringify(eval(''(''+str+'')''));
Sugiero que en lugar de tratar de "arreglar" su JSON no válido, empiece con JSON válido en primer lugar. Cómo se genera str
, se debe arreglar 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:
<div data-object="{hello:''world''}"></div>
Sugiero que lo solucione aquí, por lo que solo puede ser JSON.parse
d. En primer lugar, tanto las claves como los valores deben citarse entre comillas dobles. Debería verse como (los atributos de una sola cita en HTML son válidos):
<div data-object=''{"hello":"world"}''></div>
Ahora, puede usar JSON.parse
(o jQuery''s $.parseJSON
).
var str = ''{"hello":"world"}'';
var obj = JSON.parse(str);
Su mejor y más segura apuesta sería JSON5 - JSON para humanos . Está creado específicamente para ese caso de uso.
const result = JSON5.parse("{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }");
console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/json5/0.5.1/json5.min.js"></script>
Tienes que escribir corchetes, porque sin ellos eval
considerará el código dentro de llaves como bloque de comandos.
var i = eval("({ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] })");
Una solución con una expresión regular y sin usar eval:
str.replace(/([/s/S]*?)('')(.+?)('')([/s/S]*?)/g, "$1/"$3/"$5")
Esto creo que debería funcionar para múltiples líneas y todas las posibles apariciones (/ g flag) de comillas simples ''string'' reemplazadas por comillas dobles '''' string ''''.
Usar con precaución (debido a eval()
):
function strToJson(str) {
eval("var x = " + str + ";");
return JSON.stringify(x);
}
llamar como:
var str = "{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }";
alert( strToJson(str) );
Use un código simple en el siguiente enlace:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
var jsontext = ''{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'';
var contact = JSON.parse(jsontext);
y revertir
var str = JSON.stringify(arr);
var str = "{hello: ''world'', places: [''Á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.
str = jQuery.parseJSON(str)
Editar. Esto se proporciona si tienes una cadena JSON válida
Si la cadena JSON.stringify
de una fuente confiable , puede usar eval
luego JSON.stringify
el resultado. Me gusta esto:
var str = "{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }";
var json = JSON.stringify(eval("(" + str + ")"));
Tenga en cuenta que cuando eval
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 JSON válido para empezar y evitar tener que analizar, codificar y, presumiblemente, analizarlo de nuevo . HTML admite atributos de una sola cita (solo asegúrese de codificar HTML las comillas simples dentro de las cadenas).
var str = "{ hello: ''world'', places: [''Africa'', ''America'', ''Asia'', ''Australia''] }";
var json = JSON.stringify(eval("(" + str + ")"));