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.


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.


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>

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 ()


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.


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>


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.


-11
json = ( new Function("return " + jsonString) )(); 

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.