web-dev-qa-db-fra.com

Analyser une chaîne en tant que JSON avec des guillemets simples?

J'ai une ficelle 

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

Comment puis-je analyser la chaîne (str) au-dessus de JSON? Cela semble être une simple analyse syntaxique; ça ne marche pas.

39
Coderaemon

La norme JSON requiert des guillemets doubles et n'acceptera pas les guillemets simples, pas plus que l'analyseur.

Si vous avez un cas simple sans guillemets simples échappés dans vos chaînes (ce qui serait normalement impossible, mais ce n'est pas du JSON), vous pouvez simplement str.replace(/'/g, '"') et vous devez vous retrouver avec un JSON valide.

46
ssube

Quelque chose comme ça:

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>

4
aup

L'utilisation de guillemets simples pour les clés n'est pas autorisée dans JSON. Vous devez utiliser des guillemets doubles.

Pour votre cas d'utilisation, ce serait peut-être la solution la plus simple:

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

La source :

Si une propriété nécessite des guillemets, des guillemets doubles doivent être utilisés. Tout les noms de propriété doivent être entourés de guillemets doubles.

4
Jonathan.Brink

Je sais que c'est un ancien post, mais vous pouvez utiliser JSON5 à cette fin.

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

Si vous êtes sûr que votre JSON est en toute sécurité sous votre contrôle (et non par l'utilisateur), vous pouvez simplement évaluer le JSON. Eval accepte tous les types de devis, ainsi que les noms de propriété non cités.

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

Les parenthèses supplémentaires sont nécessaires en raison du fonctionnement de l'analyseur eval . Eval n'est pas diabolique lorsqu'il est utilisé sur des données que vous contrôlez . Pour plus d'informations sur la différence entre JSON.parse et eval (), voir JSON.parse vs eval ()