javascript - Converter string de objeto para JSON
Como posso converter uma string que descreve um objeto em uma string JSON usando JavaScript (ou jQuery)?
ex.: Converta isto (NÃO é uma string JSON válida):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
nisto:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Eu gostaria de evitar usar eval() se possível.
Resposta #1
Se a string for de uma fonte confiável, você pode usar eval e depois JSON.stringify no resultado. Assim:
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }";
var json = JSON.stringify(eval("(" + str + ")"));
Observe que quando você eval um literal de objeto, ele precisa ser envolvido em parênteses, caso contrário, as chaves serão interpretadas como um bloco em vez de um objeto.
Eu também concordo com os comentários sob a pergunta de que seria muito melhor apenas codificar o objeto em JSON válido desde o início e evitar ter que analisar, codificar e, presumivelmente, analisar novamente. O HTML suporta atributos entre aspas simples (apenas certifique-se de codificar em HTML quaisquer aspas simples dentro das strings).
Resposta #2
Sua string não é um JSON válido, então JSON.parse (ou $.parseJSON do jQuery) não funcionará.
Uma maneira seria usar eval para "analisar" o JSON "inválido" e então stringify para "converter" em JSON válido.
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
str = JSON.stringify(eval('('+str+')'));
Sugiro que, ao invés de tentar "consertar" seu JSON inválido, você comece com JSON válido desde o princípio. Como o str está sendo gerado? Ele deve ser corrigido lá, antes de ser gerado, não depois.
EDITAR: Você disse (nos comentários) que esta string é armazenada em um atributo de dados:
<div data-object="{hello:'world'}"></div>
Sugiro que você conserte isso aqui, para que possa ser apenas JSON.parsed. Primeiro, tanto as chaves quanto os valores precisam estar entre aspas duplas. Deve ficar assim (atributos entre aspas simples em HTML são válidos):
<div data-object='{"hello":"world"}'></div>
Agora, você pode apenas usar JSON.parse (ou $.parseJSON do jQuery).
var str = '{"hello":"world"}';
var obj = JSON.parse(str);
Resposta #3
jQuery.parseJSON
str = jQuery.parseJSON(str)
Editar. Isso é fornecido desde que você tenha uma string JSON válida
Resposta #4
Use código simples no link abaixo :
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);
e reverso
var str = JSON.stringify(arr);
Resposta #5
Espero que esta pequena função converta uma string JSON inválida em uma 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
let 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…}
