Pesquisa de site

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…}

Artigos relacionados