Como converter uma string que descreve um objeto em uma string JSON usando JavaScript (ou jQuery)?
por exemplo: Converta isso ( NÃO é uma string JSON válida):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
nisso:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Eu adoraria evitar o uso, eval()
se possível.
javascript
json
object
snorpey
fonte
fonte
data
-attrubute, como este:<div data-object="{hello:'world'}"></div>
e eu não quero usar aspas simples no HTML (por isso provavelmente não é para ser confiável)<div data-object='{"hello":"world"}'></div>
é 100% HTML válido (o que aspas simples têm a ver com confiar ou não?). Se você fizer dessa maneira, poderáJSON.parse
fazê-lo e funcionará bem. Nota: as chaves também precisam ser citadas.<div data-object="{\"hello\":\"world\"}"></div>
. Se você não quiser usar JSON válido no atributo, precisará criar seu próprio formato e analisá-lo.Respostas:
Se a string é de uma fonte confiável , você pode usar
eval
entãoJSON.stringify
o resultado. Como isso:Observe que, quando
eval
um objeto é literal, ele deve ser colocado entre parênteses, caso contrário, as chaves são analisadas como um bloco em vez de um objeto.Também concordo com os comentários da pergunta de que seria muito melhor codificar o objeto no JSON válido para começar e evitar a necessidade de analisar, codificar e, presumivelmente, analisá-lo novamente . O HTML oferece suporte a atributos de aspas simples (apenas codifique HTML quaisquer aspas simples dentro de strings).
fonte
eval
converte a string em um objeto JavaScript (que funciona, desde que a string represente JavaScript válido, mesmo que não seja JSON válido). Em seguida,JSON.stringify
converte de um objeto em uma sequência JSON (válida). A chamadaeval
é perigosa se a string não for de uma fonte confiável, pois poderia literalmente executar qualquer JavaScript que abra a possibilidade de ataques de script entre sites.Sua string não é JSON válida, portanto
JSON.parse
(ou do jQuery$.parseJSON
) não funcionará.Uma maneira seria usar
eval
para "analisar" o JSON "inválido" e depoisstringify
"convertê-lo" para JSON válido.Sugiro que, em vez de tentar "consertar" seu JSON inválido, você comece com JSON válido em primeiro lugar. Como está
str
sendo gerado, deve ser corrigido lá, antes de ser gerado, não depois.EDIT : Você disse (nos comentários) esta string é armazenada em um atributo de dados:
Eu sugiro que você corrija aqui, para que possa ser apenas
JSON.parse
d. Primeiro, as chaves e os valores precisam ser citados entre aspas duplas. Deve ter a aparência (atributos de aspas simples em HTML são válidos):Agora, você pode apenas usar
JSON.parse
(ou jQuery$.parseJSON
).fonte
jQuery.parseJSON
Editar. Isso é fornecido se você tiver uma sequência JSON válida
fonte
Use código simples no link abaixo:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
e reverter
fonte
Espero que essa pequena função converta uma string JSON inválida para uma válida.
Resultado
fonte
:
está em um dos valores.Use com cuidado (por causa de
eval()
):chamar como:
fonte
eval()
é a única maneira de fazê-lo. b) Eu avisei o OP sobre isso. c) Veja a resposta de Matthew Crumley e pense em uma explicação melhor. (Ah, e d) a declaraçãoeval()
é ruim é um absurdo nesta forma generalizada).eval("var x = " + str + ";")
que é JS totalmente válido. Você não precisa fazervar x = ({a:12})
.json2.js
. Não seja tão feliz em disparar.Isenção de responsabilidade: não tente fazer isso em casa ou para qualquer coisa que exija que outros desenvolvedores o levem a sério:
Lá eu fiz.
Tente não fazê-lo, pois eval é ruim para você. Como dito acima, use o calço JSON de Crockford para navegadores mais antigos (IE7 e inferiores)
Esse método requer que sua sequência seja javascript válido , que será convertido em um objeto javascript que pode ser serializado em JSON.
editar: corrigido como sugerido pelo Rocket.
fonte
JSON.stringify(eval('('+str+')'));
, não que eu desculpeeval
, mas sua string não é JSON válida, portantoJSON.parse
não funciona.Eu coloquei minha resposta para alguém que esteja interessado neste tópico antigo.
Eu criei o analisador de dados- * HTML5 para o plugin jQuery e demo que convertem uma string JSON malformada em um objeto JavaScript sem usar
eval()
.Ele pode passar os dados HTML5- * abaixo:
no objeto:
fonte
Douglas Crockford tem um conversor, mas não tenho certeza se isso ajudará com JSON ruim a bom JSON.
https://github.com/douglascrockford/JSON-js
fonte
Há uma maneira muito mais simples de realizar essa façanha, basta seqüestrar o atributo onclick de um elemento fictício para forçar o retorno da sua string como um objeto JavaScript:
Aqui está uma demonstração: http://codepen.io/csuwldcat/pen/dfzsu (abra seu console)
fonte
Você precisa usar "eval", JSON.stringify e JSON.parse para o resultado.
fonte
Você precisa escrever colchetes, porque sem eles
eval
considerará o código entre colchetes como um bloco de comandos.fonte
Sua melhor e mais segura aposta seria JSON5 - JSON for Humans . É criado especificamente para esse caso de uso.
fonte
Usar new Function () é melhor que eval, mas ainda deve ser usado apenas com entrada segura.
Fontes: MDN , 2ality
fonte
Para o seu exemplo simples acima, você pode fazer isso usando 2 substituições simples de regex:
Advertência grande : Essa abordagem ingênua pressupõe que o objeto não tenha seqüências contendo um caractere
'
ou:
. Por exemplo, não consigo pensar em uma boa maneira de converter a seguinte sequência de objetos em JSON sem usareval
:fonte
Apenas pelas peculiaridades, você pode converter sua string via
babel-standalone
fonte
var str = "{olá: 'mundo', lugares: ['África', 'América', 'Ásia', 'Austrália']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")
console.log (JSON.parse (fStr))
Desculpe, eu estou no meu telefone, aqui está uma foto.
fonte
Uma solução com um regex e não usando eval:
Acredito que isso funcione para várias linhas e todas as ocorrências possíveis (sinalizador / g) de 'string' de aspas simples substituídas por "string" de aspas duplas.
fonte
fonte
Talvez você precise tentar o seguinte:
fonte