Analizujesz ciąg jako JSON z pojedynczymi cudzysłowami?

84

Mam sznurek

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

Jak mogę przeanalizować powyższy ciąg (str) do obiektu JSON?

Wydaje się, że jest to prosta analiza. To jednak nie działa.

Coderaemon
źródło
7
Pojedyncze cudzysłowy nie są poprawnie sformatowane w formacie json, więc jeśli otrzymujesz coś takiego, prawdopodobnie będziesz musiał użyć str.replace () i zamienić pojedyncze qoute na „przed próbą przeanalizowania go
aup
1
W każdym razie powinieneś zawsze próbować używać pojedynczych cudzysłowów dla ciągów znaków w javascript. var str = "bad example";to nie jest dobra praktyka, lepiej wykonaj następujące czynności: var str = 'good example';=> w ten sposób nie będziesz mieć żadnych problemów z JSON i nie będziesz mieć żadnych problemów z HTML. :)
ReeCube
3
@ReeCube To niewiele więcej niż opinia - i tak nie ma problemu z HTML-em, akceptuje oba. W przypadku formatu JSON po co w ogóle tworzyć go za pomocą ciągów? Właściwie nie przypominam sobie, kiedy ostatni raz zbudowałem JSON z czegokolwiek innego niż obiekt.
Dave Newton,
2
@DaveNewton Regularnie tworzę ciągi json z node, python, php.
alfadog67
1
Chyba nie rozumiem, o co ci chodzi. ale ok.
alfadog67

Odpowiedzi:

87

Standard JSON wymaga podwójnych cudzysłowów i nie akceptuje pojedynczych cudzysłowów, podobnie jak parser.

Jeśli masz prosty przypadek bez cudzysłowów bez cudzysłowów w ciągach znaków (co normalnie byłoby niemożliwe, ale to nie jest JSON), możesz to zrobić str.replace(/'/g, '"')i powinieneś otrzymać prawidłowy JSON.

ssube
źródło
5
Twoja odpowiedź wpłynie na dane. Dobra odpowiedź zmieniłaby strukturę, a nie dane w strukturze danych.
Timothy Gonzalez
3
@ssube, globalne zastępowanie pojedynczych cudzysłowów cudzysłowami podwójnymi jest pierwszą, która przychodzi na myśl i jest metodą pomyłkową, ponieważ może zniszczyć wartości słownika. Np. 'title': "Mama's Friend"Stanie się "title": "Mama"s Friend", co jest oczywiście nieważne! Powinienem złagodzić twoją odpowiedź, ale jestem przeciwny. Ten komentarz jest wart znacznie więcej.
Apostolos
31

Wiem, że to stary post, ale możesz użyć do tego celu JSON5 .

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
Min
źródło
8
Uznano za pozytywnymi, ponieważ powyższe rozwiązania zawiodą z czymś takim jak:, {'section': "24'"} które stanie się: {"section": "24""} i nie będzie przetwarzane.
snedkov
1
To powinna być najlepsza odpowiedź.
Sam R.
Idealne rozwiązanie. Próbowałem wydobyć ciąg JSON ze znacznika skryptu html, który zawiera podziały wierszy i puste spacje. Uratowałem mój dzień!
DriLLFreAK100
Dla mnie to zadziałało<script>JSON.stringify(some_jsonString)</script>
jAntoni
12

Jeśli masz pewność, że Twój JSON jest bezpiecznie pod Twoją kontrolą (a nie dane wejściowe użytkownika), możesz po prostu ocenić JSON. Eval akceptuje wszystkie typy ofert, a także niecytowane nazwy właściwości.

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

Dodatkowe nawiasy są wymagane ze względu na sposób działania analizatora składni. Eval nie jest zły, gdy jest używany na danych, nad którymi masz kontrolę. Aby uzyskać więcej informacji na temat różnicy między JSON.parse i eval (), zobacz JSON.parse vs. eval ()

d'Artagnan Evergreen Barbosa
źródło
2
Nawet jeśli uważasz, że eval nie jest zły w tym przypadku, JSON.parse jest zawsze szybszy: jsperf.com/json-parse-vs-eval/3
Arkanoid
@Arkanoid Test porównawczy, z którym łączysz się, nie ma zastosowania w tym przypadku, ponieważ używa tylko prawidłowego
formatu
7

Coś takiego:

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
źródło
7
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

To rozwiązało problem.

Vaishnavi Dongre
źródło
1
spowoduje to również zmianę danych. {'a':"A'A"}stanie się{"a":"A"A"}
GodSaveTheDoge
6

Używanie apostrofów jako kluczy nie jest dozwolone w formacie JSON. Musisz użyć podwójnych cudzysłowów.

W twoim przypadku byłoby to najłatwiejsze rozwiązanie:

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

Źródło :

Jeśli właściwość wymaga cudzysłowów, należy użyć cudzysłowów. Wszystkie nazwy właściwości należy ująć w podwójne cudzysłowy.

Jonathan Brink
źródło
-12
json = ( new Function("return " + jsonString) )(); 
greg miller
źródło
Proszę wyjaśnij swoje odpowiedzi
Sterling Archer,
3
Chłopaki, nigdy tego nie róbcie. To jest bardzo niebezpieczne
jpumford
Zasadą używania Functionzamiast eval jest dźwięk, ale wszystko inne jest złe. Powinno byćvar json = Function("'use strict';return " + jsonString)()
Jack Giffin