Convertit l'objet en une chaîne JSON
Comment puis-je convertir une chaîne de caractères qui décrit un objet dans une chaîne JSON à l'aide de JavaScript (jQuery)?
e.g: Convertir ce (PAS une chaîne JSON valide):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
dans cette:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
J'aimerais éviter d'utiliser eval()
si possible.
- Pourquoi est votre chaîne non valide JSON en premier lieu? Comment allez-vous générer cela?
- La chaîne est stockée dans un
data
-attrubute, comme ceci:<div data-object="{hello:'world'}"></div>
et je ne veux pas utiliser les guillemets simples dans le code HTML(donc c'est sans doute de ne pas être digne de confiance) <div data-object='{"hello":"world"}'></div>
est 100% valide en HTML (ce qui ne les guillemets simples à faire avec la confiance ou pas?). Si vous faites de cette façon, vous pouvez simplementJSON.parse
et ça marchera très bien. Remarque: les clés doivent être cités aussi.- merci pour vos efforts! Je voulais juste trouver un moyen de contourner avoir à utiliser les guillemets simples en HTML (même si c'est 100% valide) et la notation JSON.
- Ils ont moyen de contourner est de ne pas mettre de JSON dans un attribut HTML, en premier lieu. Je suppose que vous pourriez utiliser des guillemets, et d'échapper à ceux dans le JSON
<div data-object="{\"hello\":\"world\"}"></div>
. Si vous ne souhaitez pas utiliser JSON valide dans l'attribut, alors vous allez avoir à faire votre propre format et d'analyser vous-même. - Ce sont juste des conseils au lieu de répondre. - Vous pouvez utiliser http://www.jsoneditoronline.org/ pour vérifier mon JSON. - En passant chaîne JSON à partir de code derrière conscient de l'ajout approprié des caractères d'échappement.
Vous devez vous connecter pour publier un commentaire.
Si la chaîne est à partir d'une source de confiance, vous pouvez utiliser
eval
puisJSON.stringify
le résultat. Comme ceci:Notez que lorsque vous
eval
un objet littéral, il doit être enveloppé dans des parenthèses, sinon les accolades sont analysées comme un bloc au lieu d'un objet.Je suis également d'accord avec les commentaires en-dessous de la question qu'il serait beaucoup mieux de coder l'objet en JSON valide pour commencer et éviter d'avoir à analyser, encoder, puis sans doute analyser nouveau. HTML prend en charge une seule cité attributs (juste être sûr de HTML-encoder n'importe quel guillemets à l'intérieur des chaînes de caractères).
eval
convertit la chaîne de caractères à l'objet JavaScript (qui fonctionne, tant que la chaîne représente JavaScript valide, même si elle n'est pas valide JSON). PuisJSON.stringify
convertit à partir d'un objet (valide) chaîne JSON. L'appel deeval
est dangereux si la chaîne n'est pas à partir d'une source de confiance, car il pourrait littéralement exécuter le code JavaScript qui ouvre la possibilité de cross-site scripting attaques.Votre chaîne n'est pas valide JSON, donc
JSON.parse
(ou jQuery$.parseJSON
) ne fonctionne pas.Un autre moyen serait d'utiliser
eval
à "analyser" le "non valide" JSON, puisstringify
à "convertir" à JSON valide.Je suggère plutôt que d'essayer de "réparer" votre invalid JSON, vous commencez avec JSON valide en premier lieu. Comment est
str
être généré, il doit être fixé, avant de elle est générée, pas après.MODIFIER: Vous avez dit (dans les commentaires) cette chaîne est stockée dans un attribut de données:
Je vous suggère de fixer ici, alors il peut simplement être
JSON.parse
d. Tout d'abord, ils ont les clés et les valeurs doivent être cités entre guillemets doubles. Il devrait ressembler (un seul cité attributs HTML sont valables):Maintenant, vous pouvez simplement utiliser
JSON.parse
(ou jQuery$.parseJSON
).jQuery.parseJSON
Modifier. C'est à la condition d'avoir une chaîne JSON valide
Utilisation simple code dans le lien ci-dessous :
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
et inverse
J'espère que cette petite fonction permet de convertir invalid JSON chaîne valide.
Résultat
:
est dans l'un des valeurs.À utiliser avec prudence (en raison de
eval()
):appel:
eval
est mauvais, mais sa chaîne n'est pas valide JSON, donc il ne peut pas utiliserJSON.parse
.eval()
est la seule façon de le faire. b) j'ai prévenu les OP à ce sujet. c) Regardez Matthieu Crumley la réponse de penser à une meilleure explication. (Oh, et d) la déclarationeval()
est mauvaise, c'est le non-sens dans cette forme généralisée.)eval
doit être utilisé ici. Avez-vous vu mon réponse?eval()
est la seule façon, mais votre solution ne fonctionne pas – vous oubliez d'ajouter entre parenthèses. Voir mon post ou post de @Matthieu Crumleyeval("var x = " + str + ";")
qui est totalement valide JS. Vous n'avez pas besoin de fairevar x = ({a:12})
.eval
un objet littéral, il doit être enveloppé dans des parenthèses, sinon les accolades sont analysées comme un bloc au lieu d'un objeteval
ing un littéral d'objet. Il esteval
ing une ligne de code qui définit une variable à un objet. Je vais vous demander encore une fois, Avez-vous tester? Il fonctionne très bien: jsfiddle.net/ExHWkjson2.js
. Ne pas être à la gâchette facile.JSON
, rien à voir avec laeval
. Vous pouvez utiliser Crockford du JSON cale pour ajouter la prise en charge de JSON pour IE7.)eval()
ainsi, sous le capot? Je ne serais pas surpris.Avertissement: n'essayez pas ceci à la maison, ou pour tout ce qui nécessite d'autres développeurs vous prendre au sérieux:
Là, je l'ai fait.
Essayez de ne pas le faire tho, eval est MAUVAIS pour vous. Comme dit ci-dessus, l'utilisation Crockford JSON cale pour les anciens navigateurs (IE7 et moins)
Cette méthode nécessite votre chaîne pour être valide javascript, qui sera converti en un objet javascript qui peut ensuite être sérialisé en JSON.
edit: fixe comme Fusée suggéré.
JSON.stringify(eval('('+str+')'));
, non pas que je tolèreeval
, mais sa chaîne n'est pas valide JSON pourJSON.parse
ne fonctionne pas.J'ai mis ma réponse pour quelqu'un qui s'intéressent à ce vieux thread.
J'ai créé le HTML5 de données* analyseur pour jQuery plugin et démo qui convertir un mal formé chaîne JSON dans un objet JavaScript sans utiliser
eval()
.Il peut passer le HTML5 données* les attributs ci-dessous:
dans l'objet:
Douglas Crockford a un convertisseur, mais je ne suis pas sûr que ça va aider à la mauvaise JSON à la bonne JSON.
https://github.com/douglascrockford/JSON-js
Il y a un moyen beaucoup plus simple pour accomplir cet exploit, juste détourner l'attribut onclick d'un mannequin élément de forcer un retour de votre chaîne de caractères comme un objet JavaScript:
Voici une démo: http://codepen.io/csuwldcat/pen/dfzsu (ouvrez votre console)
Vous devez utiliser "eval" puis JSON.stringify puis JSON.analyser le résultat.
Vous avez à écrire des parenthèses, car sans eux,
eval
examinera code à l'intérieur d'accolades comme bloc de commandes.Votre meilleur et le plus sûr pari serait JSON5 – JSON pour les Humains. Il est créé spécifiquement pour ce cas d'utilisation.
JS:
HTML:
Pour votre exemple simple ci-dessus, vous pouvez le faire à l'aide de 2 simple regex remplace:
Mise en garde Big: Cette approche naïve suppose que l'objet n'a pas de chaînes de caractères contenant un
'
ou:
caractère. Par exemple, je ne peux pas penser à une bonne façon de convertir l'objet string JSON sans l'aide deeval
:Juste pour les bizarreries de lui, vous pouvez convertir votre chaîne via
babel-standalone
JS:
HTML:
var str = "{ bonjour: "monde", les lieux: ["Afrique", "l'Amérique", 'Asie', 'Australie'] }"
var fStr = str
.replace(/([A-z]*)(:)/g '"$1":')
.replace(/'/g, "\"")
de la console.log(JSON.parse(fStr))
Désolé je suis sur mon téléphone, voici un pic.
Une solution avec une regex et de ne pas utiliser eval:
Cela, je crois, devrait fonctionner pour plusieurs lignes et de toutes les occurrences possibles (/g drapeau) de guillemet simple ('string' remplacé par double-quote "chaîne".
Vous avez peut-être essayer ceci:
À l'aide de la nouvelle Fonction() est mieux que eval, mais encore doit être utilisé uniquement avec entrée sécurisée.
Sources:
MDN, 2ality