Wygenerowałem trochę JSON i próbuję wciągnąć go do obiektu w JavaScript. Wciąż pojawiają się błędy. Oto co mam:
var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = eval('('+data+')');
To daje mi błąd:
unterminated string literal
Dzięki JSON.parse(data)
, widzę podobne komunikaty o błędach: „ Unexpected token ↵
” w Chrome i „ unterminated string literal
” w Firefoksie i IE.
Kiedy Wyciągam \n
po sometext
błędzie odchodzi w obu przypadkach. Nie mogę się domyślić, dlaczego to się \n
dzieje, eval
a co JSON.parse
nie.
javascript
json
newline
Niedźwiedź polarny
źródło
źródło
Odpowiedzi:
Chyba właśnie tego chcesz:
(Musisz uciec z „\” w swoim ciągu (zamieniając go w podwójne - „\”), w przeciwnym razie stanie się nową linią w źródle JSON, a nie w danych JSON.)
źródło
Trzeba będzie mieć funkcję, która zamienia
\n
się\\n
w przypadekdata
nie jest ciągiem znaków.Wynik
dataObj
będzieźródło
.replace("\\n", "\\\\n")
), a także sugerowałbym użycie wyrażenia regularnego, aby umożliwić zastąpienie wielu instancji (tj..replace(/\n/g, "\\\\n")
).replace("\n", "\\n")
powinno dobrze wykonywać pracę !! Na przykładvar test = [{"description":"Some description about the product. This can be multi-line text."}]; console.log(JSON.parse(test.replace(/\n/g, "\\n")));
wyśle obiekt idealnie do konsoli przeglądarki jako[{"description":"Some description about the product.\nThis can be multi-line text."}]
\n
do wartości.eval
funkcji. 17 głosów pozytywnych ???Zgodnie ze specyfikacją http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf :
Więc nie możesz przekazać
0x0A
ani0x0C
kodów bezpośrednio. To jest zabronione! Specyfikacja sugeruje użycie sekwencji specjalnych dla niektórych dobrze zdefiniowanych kodów odU+0000
doU+001F
:\f
reprezentuje znak kanału informacyjnego (U+000C
).\n
reprezentuje znak przesunięcia wiersza (U+000A
).Jak większość języków programowania używa
\
do cytowania, powinieneś uciec od składni escape (podwójne wyjście - raz dla języka / platformy, raz dla samego JSON):źródło
Możesz po prostu uciec od łańcucha znaków na serwerze podczas zapisywania wartości pola JSON i usunąć jego krajobraz przy pobieraniu wartości w przeglądarce klienta, na przykład.
Implementacja JavaScript wszystkich głównych przeglądarek ma polecenie unescape.
Przykład:
Na serwerze:
W przeglądarce:
źródło
Możesz zajrzeć do tej funkcji C #, aby uciec od ciągu:
http://www.aspcode.net/C-encode-a-string-for-JSON-JavaScript.aspx
źródło
>
?Użyłem tej funkcji, aby usunąć znak nowej linii lub inne znaki w danych, aby przeanalizować dane JSON:
źródło
JSON.stringify
zamieniłby powyższy ciąg na
jak wspomniano tutaj
json stringify
źródło
Napotkałem ten problem podczas tworzenia klasy w PHP 4 do emulacji json_encode (dostępnej w PHP 5). Oto, co wymyśliłem:
Przestrzegałem wymienionych tutaj zasad . Użyłem tylko tego, czego potrzebowałem, ale sądzę, że możesz dostosować to do swoich potrzeb w języku, którego używasz. Problem w moim przypadku nie dotyczył nowych linii, jak pierwotnie myślałem, ale tego, że nie uciekłem. Mam nadzieję, że zapobiegnie to komuś innemu z powodu małego bólu głowy, który wymyśliłem, co zrobiłem źle.
źródło
Jak rozumiem Cię pytanie, to nie chodzi o parsowania JSON, ponieważ można skopiować i wkleić do kodu JSON bezpośrednio - tak, czy jest to przypadek a potem po prostu skopiować JSON bezpośrednio do
dataObj
zmiennej bez zawijania z apostrofami (wskazówka:eval==evil
)źródło