¿Analizando la cadena como JSON con comillas simples?


81

Tengo una cuerda

str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)

¿Cómo puedo analizar la cadena anterior (str) en un objeto JSON?

Esto parece un análisis simple. Sin embargo, no está funcionando.


6
Las comillas simples no tienen el formato json correctamente, por lo que si recibe algo así, probablemente necesite usar str.replace () y reemplazar las qoutes simples con "antes de intentar analizarlo
aup

1
De todos modos, siempre debe intentar usar comillas simples para cadenas en javascript. var str = "bad example";no es una buena práctica, mejor haga lo siguiente: var str = 'good example';=> así no tendrá ningún problema con JSON y tampoco tendrá problemas con HTML. :)
ReeCube

3
@ReeCube Eso parece poco más que una opinión; de todos modos, no hay problema con HTML, acepta ambos. Para JSON, ¿por qué crearlo con cadenas de todos modos? En realidad, no recuerdo la última vez que construí JSON a partir de otra cosa que no sea un objeto.
Dave Newton

2
@DaveNewton Creo cadenas json desde node, python, php regularmente.
alfadog67

1
Supongo que no entiendo tu punto. pero está bien.
alfadog67

Respuestas:


87

El estándar JSON requiere comillas dobles y no aceptará comillas simples, ni tampoco el analizador.

Si tiene un caso simple sin comillas simples de escape en sus cadenas (lo que normalmente sería imposible, pero esto no es JSON), puede str.replace(/'/g, '"')hacerlo de manera simple y debería terminar con JSON válido.


5
Su respuesta alterará los datos. Una buena respuesta cambiaría la estructura y no los datos dentro de la estructura de datos.
Timothy Gonzalez

3
@ssube, el reemplazo global de comillas simples por dobles es lo primero que me viene a la mente y es un método descuidado, porque puede destruir los valores del diccionario. Por ejemplo, 'title': "Mama's Friend"se convertirá "title": "Mama"s Friend", lo que por supuesto no es válido. Debería votar en contra de su respuesta, pero estoy en contra. Este comentario vale mucho más.
Apostolos

31

Sé que es una publicación antigua, pero puedes usar JSON5 para este propósito.

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>

8
Se votó a favor porque las soluciones anteriores fallarán con algo como: {'section': "24'"} que se convierte en: {"section": "24""} y no se analizará.
snedkov

1
Esta debería ser la mejor respuesta.
Sam R.

Solución perfecta. Intentaba extraer una cadena JSON de la etiqueta de script de html, que contiene saltos de línea y espacios vacíos. ¡Salvó mi día!
DriLLFreAK100

Para mí esto funcionó<script>JSON.stringify(some_jsonString)</script>
jAntoni

12

Si está seguro de que su JSON está bajo su control de forma segura (no la entrada del usuario), simplemente puede evaluar el JSON. Eval acepta todos los tipos de citas, así como los nombres de propiedades sin comillas.

var str = "{'a':1}";
var myObject = (0, eval)('(' + str + ')');

Los paréntesis adicionales son necesarios debido a cómo funciona el analizador eval. Eval no es malo cuando se usa en datos sobre los que tiene control. Para obtener más información sobre la diferencia entre JSON.parse y eval (), consulte JSON.parse frente a eval ()


2
Incluso si cree que eval no es malo en este caso, JSON.parse siempre es más rápido: jsperf.com/json-parse-vs-eval/3
Arkanoid

@Arkanoid El punto de referencia al que se vinculó no se aplica a este caso, ya que solo usa JSON válido (debido a JSON.stringify)
syockit

8
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

Esto resolvió mi problema.


1
esto también modificará los datos. {'a':"A'A"}se convertirá en{"a":"A"A"}
GodSaveTheDoge

7

Algo como esto:

var div = document.getElementById("result");

var str = "{'a':1}";
  str = str.replace(/\'/g, '"');
  var parsed = JSON.parse(str);
  console.log(parsed);
  div.innerText = parsed.a;
<div id="result"></div>


6

No se permite el uso de comillas simples para las claves en JSON. Debe utilizar comillas dobles.

Para su caso de uso, tal vez esta sea la solución más fácil:

str = '{"a":1}';

Fuente :

Si una propiedad requiere comillas, se deben usar comillas dobles. Todos los nombres de propiedad deben estar entre comillas dobles.


-11
json = ( new Function("return " + jsonString) )(); 

Explique sus respuestas
Sterling Archer

3
Chicos, nunca hagan esto. Esto es muy inseguro
jpumford

El principio de usar en Functionlugar de eval es correcto, pero todo lo demás está mal. Debería servar json = Function("'use strict';return " + jsonString)()
Jack Giffin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.