Jak przekonwertować ciąg opisujący obiekt na ciąg JSON przy użyciu JavaScript (lub jQuery)?
np .: Przekonwertuj to ( NIE jest to prawidłowy ciąg JSON):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
zaangażowany w to:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Chciałbym uniknąć używania, eval()
jeśli to możliwe.
javascript
json
object
snorpey
źródło
źródło
data
-attrubute, w ten sposób:<div data-object="{hello:'world'}"></div>
i nie chcę używać pojedynczych cudzysłowów w<div data-object='{"hello":"world"}'></div>
jest w 100% poprawnym kodem HTML (co mają wspólnego cudzysłowy z zaufaniem lub nie?). Jeśli zrobisz to w ten sposób, możesz to po prostuJSON.parse
zrobić i będzie dobrze. Uwaga: klucze też muszą być cytowane.<div data-object="{\"hello\":\"world\"}"></div>
. Jeśli nie chcesz używać prawidłowego JSON w atrybucie, będziesz musiał stworzyć własny format i samodzielnie go przeanalizować.Odpowiedzi:
Jeśli łańcuch jest z zaufanego źródła , można użyć
eval
wtedyJSON.stringify
wynik. Lubię to:Zwróć uwagę, że kiedy jesteś
eval
literałem obiektu, musi on być umieszczony w nawiasach, w przeciwnym razie nawiasy klamrowe są analizowane jako blok, a nie obiekt.Zgadzam się również z komentarzami pod pytaniem, że znacznie lepiej byłoby po prostu zakodować obiekt w prawidłowym formacie JSON na początek i uniknąć konieczności analizowania, kodowania, a następnie prawdopodobnie ponownego analizowania . HTML obsługuje atrybuty w pojedynczych cudzysłowach (pamiętaj tylko, aby zakodować w formacie HTML wszystkie pojedyncze cudzysłowy w ciągach znaków).
źródło
eval
konwertuje ciąg znaków na obiekt JavaScript (który działa, o ile ciąg reprezentuje prawidłowy JavaScript, nawet jeśli nie jest to poprawny JSON). NastępnieJSON.stringify
konwertuje obiekt z powrotem na (prawidłowy) ciąg JSON. Wywołanieeval
jest niebezpieczne, jeśli ciąg nie pochodzi z zaufanego źródła, ponieważ może dosłownie uruchomić dowolny kod JavaScript, co otwiera możliwość ataków typu cross-site scripting.Twój ciąg nie jest prawidłowym plikiem JSON, więc
JSON.parse
(lub jQuery$.parseJSON
) nie będzie działać.Jednym ze sposobów byłoby
eval
„przeanalizowanie” „nieprawidłowego” kodu JSON, a następniestringify
„przekonwertowanie” go na prawidłowy format JSON.Sugeruję, aby zamiast próbować „naprawić” nieprawidłowy kod JSON, najpierw zacznij od prawidłowego formatu JSON. Jak jest
str
generowany, należy to naprawić tam, zanim zostanie wygenerowany, a nie po.EDYCJA : Powiedziałeś (w komentarzach) ten ciąg jest przechowywany w atrybucie danych:
Proponuję naprawić to tutaj, więc może to być po prostu
JSON.parse
d. Po pierwsze, zarówno klucze, jak i wartości należy podać w cudzysłowach. Powinien wyglądać następująco (pojedyncze cudzysłowy atrybuty w HTML są prawidłowe):Teraz możesz po prostu użyć
JSON.parse
(lub jQuery$.parseJSON
).źródło
jQuery.parseJSON
Edytować. Pod warunkiem, że masz prawidłowy ciąg JSON
źródło
Użyj prostego kodu w linku poniżej:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
i odwrotnie
źródło
Mam nadzieję, że ta mała funkcja konwertuje nieprawidłowy ciąg JSON na prawidłowy.
Wynik
źródło
:
jest w jednej z wartości.Używaj ostrożnie (ze względu na
eval()
):zadzwoń jako:
źródło
eval()
to jedyny sposób, aby to zrobić. b) Ostrzegłem o tym PO. c) Spójrz na odpowiedź Matthew Crumleya i pomyśl o lepszym wyjaśnieniu. (Och, id) stwierdzenieeval()
jest złe, jest nonsensem w tej uogólnionej formie.)eval("var x = " + str + ";")
co jest całkowicie poprawnym JS. Nie musisz tego robićvar x = ({a:12})
.json2.js
. Nie bądź taki szczęśliwy.Zastrzeżenie: nie próbuj tego w domu ani w przypadku niczego, co wymaga, aby inni deweloperzy traktowali Cię poważnie:
Tam, zrobiłem to.
Staraj się tego nie robić, eval jest dla ciebie ZŁE. Jak wspomniano powyżej, użyj podkładki JSON firmy Crockford dla starszych przeglądarek (IE7 i starszych)
Ta metoda wymaga, aby ciąg był prawidłowym skryptem javascript , który zostanie przekonwertowany na obiekt javascript, który można następnie serializować do formatu JSON.
edycja: naprawiono zgodnie z sugestią Rocket.
źródło
JSON.stringify(eval('('+str+')'));
, nie to, że zgadzam sięeval
, ale jego ciąg nie jest prawidłowym kodem JSON, więcJSON.parse
nie działa.Swoją odpowiedź umieściłem dla kogoś, kogo interesuje ten stary wątek.
Stworzyłem parser danych HTML5 * dla wtyczki i wersji demonstracyjnej jQuery, które konwertują zniekształcony ciąg JSON na obiekt JavaScript bez użycia
eval()
.Może przekazywać atrybuty data- * HTML5 poniżej:
do obiektu:
źródło
Douglas Crockford ma konwerter, ale nie jestem pewien, czy pomoże to ze złym JSON do dobrego JSON.
https://github.com/douglascrockford/JSON-js
źródło
Jest o wiele prostszy sposób na wykonanie tego wyczynu, po prostu przejmij atrybut onclick elementu fikcyjnego, aby wymusić zwrot ciągu jako obiektu JavaScript:
Oto demo: http://codepen.io/csuwldcat/pen/dfzsu (otwórz konsolę)
źródło
Do wyniku należy użyć „eval”, a następnie JSON.stringify i JSON.parse.
źródło
Musisz pisać nawiasy okrągłe, ponieważ bez nich
eval
kod w nawiasach klamrowych będzie traktowany jako blok poleceń.źródło
Najlepszym i najbezpieczniejszym zakładem byłby JSON5 - JSON dla ludzi . Jest tworzony specjalnie dla tego przypadku użycia.
źródło
Korzystanie z nowej funkcji Function () jest lepsze niż eval, ale nadal powinno być używane tylko z bezpiecznym wprowadzaniem.
Źródła: MDN , 2ality
źródło
W powyższym prostym przykładzie możesz to zrobić za pomocą 2 prostych zamian wyrażeń regularnych:
Duże zastrzeżenie : to naiwne podejście zakłada, że obiekt nie ma ciągów zawierających znak
'
lub:
. Na przykład nie mogę wymyślić dobrego sposobu na przekonwertowanie następującego ciągu obiektu na JSON bez użyciaeval
:źródło
Tylko ze względu na dziwactwa możesz przekonwertować swój ciąg za pomocą
babel-standalone
źródło
var str = "{hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")
console.log (JSON.parse (fStr))
Przepraszam, rozmawiam przez telefon, oto zdjęcie.
źródło
Rozwiązanie z jednym wyrażeniem regularnym i nie używające eval:
Uważam, że powinno to działać dla wielu wierszy i wszystkich możliwych wystąpień (flaga / g) pojedynczego cudzysłowu „ciągu” zastąpionego podwójnym cudzysłowem „ciąg”.
źródło
źródło
Może musisz spróbować tego:
źródło