String als JSON mit einfachen Anführungszeichen analysieren?

81

Ich habe eine Schnur

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

Wie kann ich die obige Zeichenfolge (str) in ein JSON-Objekt analysieren?

Dies scheint eine einfache Analyse zu sein. Es funktioniert aber nicht.

Coderaemon
quelle
6
Einfache Anführungszeichen sind nicht korrekt formatiert. Wenn Sie also so etwas erhalten, müssen Sie wahrscheinlich str.replace () verwenden und einzelne Anführungszeichen durch "ersetzen, bevor Sie versuchen, es zu analysieren
bis zum
1
Sie sollten auf jeden Fall immer versuchen, einfache Anführungszeichen für Zeichenfolgen in Javascript zu verwenden. var str = "bad example";ist keine gute Praxis, machen Sie besser Folgendes: var str = 'good example';=> So haben Sie keine Probleme mit JSON und Sie werden auch keine Probleme mit HTML haben. :)
ReeCube
3
@ReeCube Das scheint kaum mehr als eine Meinung zu sein - es gibt sowieso kein Problem mit HTML, es akzeptiert beides. Warum sollte JSON es überhaupt mit Strings erstellen? Ich erinnere mich nicht an das letzte Mal, als ich JSON aus etwas anderem als einem Objekt erstellt habe.
Dave Newton
2
@ DaveNewton Ich erstelle regelmäßig JSON-Strings aus Node, Python, PHP.
Alfadog67
1
Ich glaube, ich verstehe deinen Standpunkt nicht. aber ok.
Alfadog67

Antworten:

87

Der JSON-Standard erfordert doppelte Anführungszeichen und akzeptiert weder einfache Anführungszeichen noch den Parser.

Wenn Sie einen einfachen Fall ohne einfache Anführungszeichen in Ihren Zeichenfolgen haben (was normalerweise unmöglich wäre, aber dies ist kein JSON), können Sie dies einfach tun str.replace(/'/g, '"')und sollten am Ende einen gültigen JSON erhalten.

ssube
quelle
5
Ihre Antwort wird Daten manipulieren. Eine gute Antwort würde die Struktur und nicht die Daten innerhalb der Datenstruktur ändern.
Timothy Gonzalez
3
@ssube, das globale Ersetzen von einfachen Anführungszeichen durch doppelte Anführungszeichen ist das erste, das mir in den Sinn kommt und eine schlampige Methode ist, da es die Wörterbuchwerte zerstören kann. ZB 'title': "Mama's Friend"wird "title": "Mama"s Friend", was natürlich ungültig ist! Ich sollte Ihre Antwort ablehnen, bin aber gegen eine Ablehnung. Dieser Kommentar ist viel mehr wert.
Apostolos
31

Ich weiß, dass es ein alter Beitrag ist, aber Sie können JSON5 für diesen Zweck verwenden.

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
Mindest
quelle
8
Upvoted, weil die oben genannten Lösungen mit etwas wie: {'section': "24'"} was wird: {"section": "24""} und wird nicht analysieren.
Snedkov
1
Dies sollte die beste Antwort sein.
Sam R.
Perfekte Lösung. Ich habe versucht, eine JSON-Zeichenfolge aus dem Skript-Tag von HTML zu entfernen, das Zeilenumbrüche und Leerzeichen enthält. Rettete meinen Tag!
DriLLFreAK100
Für mich hat das funktioniert<script>JSON.stringify(some_jsonString)</script>
jAntoni
12

Wenn Sie sicher sind, dass Ihr JSON sicher unter Ihrer Kontrolle steht (keine Benutzereingabe), können Sie den JSON einfach auswerten. Eval akzeptiert alle Anführungszeichen sowie nicht zitierte Eigenschaftsnamen.

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

Die zusätzlichen Klammern sind aufgrund der Funktionsweise des Eval-Parsers erforderlich. Eval ist nicht böse, wenn es für Daten verwendet wird, über die Sie die Kontrolle haben. Weitere Informationen zum Unterschied zwischen JSON.parse und eval () finden Sie unter JSON.parse vs. eval ()

d'Artagnan Immergrüne Barbosa
quelle
2
Auch wenn Sie denken, dass Eval in diesem Fall nicht böse ist, ist JSON.parse immer schneller: jsperf.com/json-parse-vs-eval/3
Arkanoid
@Arkanoid Der von Ihnen verlinkte Benchmark gilt nicht für diesen Fall, da nur gültiger JSON (aufgrund von JSON.stringify) verwendet wird
syockit
8
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

Dies löste das Problem für mich.

Vaishnavi Dongre
quelle
1
Dadurch werden auch die Daten geändert. {'a':"A'A"}wird{"a":"A"A"}
GodSaveTheDoge
7

Etwas wie das:

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>

aup
quelle
6

Die Verwendung von einfachen Anführungszeichen für Schlüssel ist in JSON nicht zulässig. Sie müssen doppelte Anführungszeichen verwenden.

Für Ihren Anwendungsfall wäre dies vielleicht die einfachste Lösung:

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

Quelle :

Wenn für eine Eigenschaft Anführungszeichen erforderlich sind, müssen doppelte Anführungszeichen verwendet werden. Alle Eigenschaftsnamen müssen in doppelte Anführungszeichen gesetzt werden.

Jonathan.Brink
quelle
-11
json = ( new Function("return " + jsonString) )(); 
Greg Miller
quelle
Bitte erklären Sie Ihre Antworten
Sterling Archer
3
Leute, macht das nie. Dies ist super unsicher
jpumford
Das Prinzip der Verwendung Functionanstelle von eval ist gesund, aber alles andere ist falsch. Es sollte seinvar json = Function("'use strict';return " + jsonString)()
Jack Giffin