Comment puis-je convertir une chaîne qui décrit un objet en une chaîne JSON à l'aide de JavaScript (ou jQuery)?
par exemple: Convertissez ceci ( PAS une chaîne JSON valide):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
dans ceci:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
J'adorerais éviter d'utiliser eval()
si possible.
javascript
json
object
snorpey
la source
la source
data
-attrubute, comme ceci:<div data-object="{hello:'world'}"></div>
et je ne veux pas utiliser de guillemets simples dans le HTML (donc il n'est probablement pas digne de confiance)<div data-object='{"hello":"world"}'></div>
est du HTML 100% valide (qu'est-ce que les guillemets simples ont à voir avec le fait de lui faire confiance ou non?). Si vous le faites de cette façon, vous pouvez le faireJSON.parse
et cela fonctionnera bien. Remarque: les clés doivent également être citées.<div data-object="{\"hello\":\"world\"}"></div>
. Si vous ne souhaitez pas utiliser de JSON valide dans l'attribut, vous devrez créer votre propre format et l'analyser vous-même.Réponses:
Si la chaîne est d'une source fiable , vous pouvez utiliser
eval
ensuiteJSON.stringify
le résultat. Comme ça:Notez que lorsque vous
eval
utilisez un objet littéral, il doit être placé entre parenthèses, sinon les accolades sont analysées comme un bloc au lieu d'un objet.Je suis également d'accord avec les commentaires sous la question qu'il serait bien préférable de simplement encoder l'objet dans un JSON valide pour commencer et éviter d'avoir à l'analyser, l'encoder, puis vraisemblablement l'analyser à nouveau . HTML prend en charge les attributs entre guillemets simples (assurez-vous simplement d'encoder en HTML les guillemets simples à l'intérieur des chaînes).
la source
eval
convertit la chaîne en un objet JavaScript (ce qui fonctionne, tant que la chaîne représente du JavaScript valide, même si ce n'est pas du JSON valide). PuisJSON.stringify
convertit à partir d'un objet en une chaîne JSON (valide). L'appeleval
est dangereux si la chaîne ne provient pas d'une source fiable, car elle pourrait littéralement exécuter n'importe quel JavaScript, ce qui ouvre la possibilité d'attaques de script intersite.Votre chaîne n'est pas JSON valide, donc
JSON.parse
(ou jQuery$.parseJSON
) ne fonctionnera pas.Une façon serait d'utiliser
eval
pour "analyser" le JSON "invalide", puisstringify
pour le "convertir" en JSON valide.Je suggère qu'au lieu d'essayer de «réparer» votre JSON invalide, vous commencez par un JSON valide. Comment est
str
généré, il devrait être corrigé ici, avant qu'il ne soit généré, pas après.EDIT : Vous avez dit (dans les commentaires) que cette chaîne est stockée dans un attribut de données:
Je vous suggère de le réparer ici, donc ça peut juste être
JSON.parse
d. Tout d'abord, les clés et les valeurs doivent être entre guillemets. Cela devrait ressembler à (les attributs entre guillemets simples en HTML sont valides):Maintenant, vous pouvez simplement utiliser
JSON.parse
(ou jQuery$.parseJSON
).la source
jQuery.parseJSON
Éditer. Ceci est à condition que vous ayez une chaîne JSON valide
la source
Utilisez un code simple dans le lien ci-dessous:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
et inverser
la source
J'espère que cette petite fonction convertit une chaîne JSON invalide en une chaîne valide.
Résultat
la source
:
est dans l'une des valeurs.À utiliser avec prudence (à cause de
eval()
):appeler comme:
la source
eval()
est la seule façon de le faire. b) J'ai averti l'OP à ce sujet. c) Regardez la réponse de Matthew Crumley et pensez à une meilleure explication. (Oh, et d) la déclarationeval()
est mauvaise est un non-sens sous cette forme généralisée.)eval("var x = " + str + ";")
qui est totalement valide JS. Vous n'avez pas besoin de fairevar x = ({a:12})
.json2.js
. Ne soyez pas si heureux.Avertissement: n'essayez pas cela à la maison, ou pour tout ce qui nécessite que d'autres développeurs vous prennent au sérieux:
Là, je l'ai fait.
Essayez de ne pas le faire, l'évaluation est MAUVAISE pour vous. Comme indiqué ci-dessus, utilisez le shim JSON de Crockford pour les navigateurs plus anciens (IE7 et inférieurs)
Cette méthode nécessite que votre chaîne soit un javascript valide , qui sera converti en un objet javascript qui peut ensuite être sérialisé en JSON.
edit: corrigé comme Rocket l'a suggéré.
la source
JSON.stringify(eval('('+str+')'));
, non pas que je cautionneeval
, mais sa chaîne n'est pas JSON valide etJSON.parse
ne fonctionne donc pas.Je mets ma réponse pour quelqu'un qui s'intéresse à ce vieux fil.
J'ai créé l' analyseur de données HTML5 pour le plugin jQuery et la démo qui convertissent une chaîne JSON malformée en un objet JavaScript sans utiliser
eval()
.Il peut transmettre les attributs HTML5 data- * ci-dessous:
dans l'objet:
la source
Douglas Crockford a un convertisseur, mais je ne suis pas sûr que cela aidera avec un mauvais JSON en bon JSON.
https://github.com/douglascrockford/JSON-js
la source
Il existe un moyen beaucoup plus simple d'accomplir cet exploit, il suffit de détourner l'attribut onclick d'un élément factice pour forcer le retour de votre chaîne en tant qu'objet JavaScript:
Voici une démo: http://codepen.io/csuwldcat/pen/dfzsu (ouvrez votre console)
la source
Vous devez utiliser "eval" puis JSON.stringify puis JSON.parse pour le résultat.
la source
Vous devez écrire des crochets, car sans eux,
eval
le code entre accolades sera considéré comme un bloc de commandes.la source
Votre meilleur pari et le plus sûr serait JSON5 - JSON for Humans . Il est créé spécifiquement pour ce cas d'utilisation.
la source
L'utilisation de new Function () est meilleure que eval, mais ne doit être utilisée qu'avec une entrée sûre.
Sources: MDN , 2ality
la source
Pour votre exemple simple ci-dessus, vous pouvez le faire en utilisant 2 simples remplacements de regex:
Grande mise en garde : cette approche naïve suppose que l'objet n'a pas de chaînes contenant un caractère
'
ou:
. Par exemple, je ne peux pas penser à un bon moyen de convertir la chaîne d'objet suivante en JSON sans utilisereval
:la source
Juste pour les bizarreries, vous pouvez convertir votre chaîne via
babel-standalone
la source
var str = "{bonjour: 'monde', lieux: ['Afrique', 'Amérique', 'Asie', 'Australie']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")
console.log (JSON.parse (fStr))
Désolé je suis sur mon téléphone, voici une photo.
la source
Une solution avec une expression régulière et n'utilisant pas eval:
Je crois que cela devrait fonctionner pour plusieurs lignes et toutes les occurrences possibles (/ g flag) de "chaîne" à guillemets simples remplacés par "chaîne".
la source
la source
Vous devez peut-être essayer ceci:
la source