Wie kann ich eine Zeichenfolge, die ein Objekt beschreibt, mithilfe von JavaScript (oder jQuery) in eine JSON-Zeichenfolge konvertieren?
Beispiel: Konvertieren Sie dies ( KEINE gültige JSON-Zeichenfolge):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
das mögen:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Ich würde es gerne vermeiden, eval()
wenn möglich.
javascript
json
object
Snorpey
quelle
quelle
data
-attrubute wie folgt gespeichert :<div data-object="{hello:'world'}"></div>
und ich möchte keine einfachen Anführungszeichen im HTML verwenden (daher ist es wahrscheinlich nicht vertrauenswürdig)<div data-object='{"hello":"world"}'></div>
ist 100% gültiges HTML (was haben einfache Anführungszeichen damit zu tun, ihm zu vertrauen oder nicht?). Wenn Sie es so machen, können Sie es einfachJSON.parse
und es wird gut funktionieren. Hinweis: Die Schlüssel müssen ebenfalls in Anführungszeichen gesetzt werden.<div data-object="{\"hello\":\"world\"}"></div>
. Wenn Sie kein gültiges JSON im Attribut verwenden möchten, müssen Sie Ihr eigenes Format erstellen und es selbst analysieren.Antworten:
Wenn die Zeichenfolge aus einer vertrauenswürdigen Quelle stammen , könnten Sie
eval
dannJSON.stringify
das Ergebnis. So was:Beachten Sie, dass, wenn Sie
eval
ein Objektliteral in Klammern eingeschlossen werden muss, andernfalls werden die geschweiften Klammern als Block anstelle eines Objekts analysiert.Ich stimme auch mit den Kommentaren unter der Frage , dass es viel besser ist das Objekt in gültiger JSON nur kodieren wäre zu beginnen und zu vermeiden, kodieren zu analysieren ist, dann vermutlich analysiert es wieder . HTML unterstützt Attribute in einfachen Anführungszeichen (stellen Sie nur sicher, dass alle einfachen Anführungszeichen in Zeichenfolgen HTML-codiert sind).
quelle
eval
die Zeichenfolge in ein JavaScript-Objekt zu konvertieren (was funktioniert, solange die Zeichenfolge gültiges JavaScript darstellt, auch wenn es kein gültiges JSON ist). DannJSON.stringify
wandelt die von einem Objekt zurück zu einem (gültig) JSON String. Das Aufrufeneval
ist gefährlich, wenn die Zeichenfolge nicht aus einer vertrauenswürdigen Quelle stammt, da buchstäblich jedes JavaScript ausgeführt werden kann, das die Möglichkeit von Cross-Site-Scripting-Angriffen eröffnet.Ihre Zeichenfolge ist nicht gültig JSON, also
JSON.parse
(oder jQuery's$.parseJSON
funktioniert ) nicht.Eine Möglichkeit wäre,
eval
den "ungültigen" JSON zu "analysieren" und ihn dannstringify
in einen gültigen JSON zu "konvertieren".Ich schlage vor, anstatt zu versuchen, Ihren ungültigen JSON zu "reparieren", beginnen Sie zunächst mit einem gültigen JSON. Wie
str
generiert wird, sollte dort festgelegt werden, bevor es generiert wird, nicht danach.EDIT : Sie sagten (in den Kommentaren), dass diese Zeichenfolge in einem Datenattribut gespeichert ist:
Ich schlage vor, Sie beheben es hier, so dass es einfach
JSON.parse
d sein kann. Zunächst müssen sowohl die Schlüssel als auch die Werte in doppelte Anführungszeichen gesetzt werden. Es sollte so aussehen (Attribute in einfachen Anführungszeichen in HTML sind gültig):Jetzt können Sie einfach
JSON.parse
(oder jQuery's$.parseJSON
) verwenden.quelle
jQuery.parseJSON
Bearbeiten. Vorausgesetzt, Sie haben eine gültige JSON-Zeichenfolge
quelle
Verwenden Sie einfachen Code im folgenden Link:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
und umgekehrt
quelle
Ich hoffe, diese kleine Funktion konvertiert ungültige JSON-Zeichenfolgen in gültige.
Ergebnis
quelle
:
sich einer der Werte befindet.Vorsichtig anwenden (wegen
eval()
):Anruf als:
quelle
eval()
ist der einzige Weg, dies zu tun. b) Ich habe das OP darauf hingewiesen. c) Sehen Sie sich Matthew Crumleys Antwort an und überlegen Sie sich eine bessere Erklärung. (Oh, und d) die Aussageeval()
ist schlecht ist Unsinn in dieser verallgemeinerten Form.)eval("var x = " + str + ";")
was absolut gültig ist JS. Das musst du nicht tunvar x = ({a:12})
.json2.js
. Sei nicht so triggerglücklich.Haftungsausschluss: Versuchen Sie dies nicht zu Hause oder für Dinge, bei denen andere Entwickler Sie ernst nehmen müssen:
Dort habe ich es getan.
Versuche es nicht zu tun, eval ist SCHLECHT für dich. Verwenden Sie wie oben beschrieben Crockfords JSON-Shim für ältere Browser (IE7 und darunter).
Für diese Methode muss Ihre Zeichenfolge ein gültiges Javascript sein , das in ein Javascript-Objekt konvertiert wird, das dann in JSON serialisiert werden kann.
edit: behoben wie von Rocket vorgeschlagen.
quelle
JSON.stringify(eval('('+str+')'));
, dass ich es nicht gutheißeeval
, aber seine Zeichenfolge ist kein gültiger JSON,JSON.parse
funktioniert also nicht.Ich habe meine Antwort für jemanden gegeben, der sich für diesen alten Thread interessiert.
Ich habe den HTML5-Daten- * Parser für das jQuery-Plugin und die Demo erstellt , die eine fehlerhafte JSON-Zeichenfolge ohne Verwendung in ein JavaScript-Objekt konvertieren
eval()
.Es kann die folgenden HTML5-Daten- * Attribute übergeben:
in das Objekt:
quelle
Douglas Crockford hat einen Konverter, aber ich bin nicht sicher, ob er bei schlechtem JSON zu gutem JSON helfen wird.
https://github.com/douglascrockford/JSON-js
quelle
Es gibt eine viel einfachere Möglichkeit, dieses Kunststück zu erreichen. Entführen Sie einfach das onclick-Attribut eines Dummy-Elements, um die Rückgabe Ihrer Zeichenfolge als JavaScript-Objekt zu erzwingen:
Hier ist eine Demo: http://codepen.io/csuwldcat/pen/dfzsu (öffnen Sie Ihre Konsole)
quelle
Sie müssen "eval", dann JSON.stringify und dann JSON.parse für das Ergebnis verwenden.
quelle
Sie müssen runde Klammern schreiben, da ohne sie
eval
Code in geschweiften Klammern als Befehlsblock betrachtet wird.quelle
Ihre beste und sicherste Wette wäre JSON5 - JSON für Menschen . Es wurde speziell für diesen Anwendungsfall erstellt.
quelle
Die Verwendung von new Function () ist besser als eval, sollte jedoch nur mit sicherer Eingabe verwendet werden.
Quellen: MDN , 2ality
quelle
Für Ihr einfaches Beispiel oben können Sie dies mit 2 einfachen Regex-Ersetzungen tun:
Große Einschränkung : Bei diesem naiven Ansatz wird davon ausgegangen , dass das Objekt keine Zeichenfolgen enthält, die ein
'
oder ein:
Zeichen enthalten. Ich kann mir zum Beispiel keine gute Möglichkeit vorstellen, die folgende Objektzeichenfolge ohne Verwendung in JSON zu konvertiereneval
:quelle
Nur für die Macken davon können Sie Ihre Zeichenfolge über konvertieren
babel-standalone
quelle
var str = "{Hallo: 'Welt', Orte: ['Afrika', 'Amerika', 'Asien', 'Australien']}" var fStr = str .replace (/ ([Az] *) (:) / g, '$ 1 ":') .replace (/ '/ g," ")
console.log (JSON.parse (fStr))
Entschuldigung, ich bin auf meinem Handy, hier ist ein Bild.
quelle
Eine Lösung mit einem regulären Ausdruck und ohne Verwendung von eval:
Dies sollte meiner Meinung nach für mehrere Zeilen funktionieren und alle möglichen Vorkommen (/ g Flag) von "Zeichenfolge" in einfachen Anführungszeichen werden durch "Zeichenfolge" in doppelten Anführungszeichen ersetzt.
quelle
quelle
Vielleicht müssen Sie dies versuchen:
quelle