Piszę niektóre pliki danych w formacie JSON i chciałbym, aby niektóre naprawdę długie wartości ciągu były podzielone na wiele wierszy. Używając modułu JSON Pythona, otrzymuję wiele błędów, niezależnie od tego, czy używam, \
czy \n
jako ucieczki.
Czy w JSON jest możliwe ciągi wieloliniowe? To głównie dla wygody wizualnej, więc przypuszczam, że mogę po prostu włączyć zawijanie wyrazów w moim edytorze, ale jestem trochę ciekawy ...
Odpowiedzi:
JSON nie pozwala na prawdziwe łamanie linii. Musisz zastąpić wszystkie podziały linii
\n
.na przykład:
"first line second line"
można zapisać za pomocą:
"first line\nsecond line"
Uwaga:
ponieważ
Python
należy to zapisać jako:"first line\\nsecond line"
gdzie
\\
jest ucieczka przed odwrotnym ukośnikiem, w przeciwnym razie python będzie traktował\n
jako znak kontrolny „nowy wiersz”źródło
\n
-ie za pomocą just i wysyłanie ich przez Curses)\n
wydaje się działać dobrze. Wygląda na to, że zależy to od silnika wyświetlania / renderowania.Musiałem to zrobić dla małego projektu Node.js i znalazłem obejście :
Wydaje mi się to całkiem fajne, poza tym muszę wszędzie używać podwójnych cudzysłowów. Chociaż w przeciwnym razie mógłbym użyć YAML, ale ma to inne pułapki i nie jest obsługiwane natywnie. Po przeanalizowaniu po prostu używam
myData.modify_head.join('\n')
lubmyData.modify_head.join()
, w zależności od tego, czy chcę łamać linie po każdym łańcuchu, czy nie.źródło
Niestety wiele odpowiedzi tutaj dotyczy pytania, jak wstawić znak nowej linii w danych ciągu. Pytanie brzmi, jak poprawić wygląd kodu, dzieląc wartość ciągu na wiele wierszy kodu. (I nawet odpowiedzi, które to rozpoznają, zapewniają „rozwiązania”, które zakładają, że można dowolnie zmieniać reprezentację danych, co w wielu przypadkach nie jest).
A najgorsze jest to, że nie ma dobrej odpowiedzi.
W wielu językach programowania, nawet jeśli nie obsługują one jawnie podziału ciągów między wierszami, nadal można użyć konkatenacji ciągów, aby uzyskać pożądany efekt; i dopóki kompilator nie jest okropny, nie ma problemu.
Ale json nie jest językiem programowania; to tylko reprezentacja danych. Nie możesz tego powiedzieć, żeby łączyć łańcuchy. Jego (dość mała) gramatyka nie obejmuje również żadnej funkcji do reprezentowania łańcucha na wielu liniach.
Pomijając opracowanie jakiegoś preprocesora (a ja, na przykład, nie mam ochoty skutecznie wymyślić własnego języka, aby rozwiązać ten problem), nie ma ogólnego rozwiązania tego problemu. JEŚLI możesz zmienić format danych, możesz zastąpić tablicę ciągów. W przeciwnym razie jest to jeden z wielu sposobów, w jakie Json nie jest zaprojektowany z myślą o czytelności dla ludzi.
źródło
Sprawdź specyfikację ! JSON gramatyki za char produkcja może przyjmować następujące wartości:
"
-lub\
-lub-kontrolny\"
\\
\/
\b
\f
\n
\r
\t
\u
czterocyfrowe cyfryNowe linie to „znaki kontrolne”, więc nie, możesz nie mieć dosłownie nowej linii w swoim ciągu. Można go jednak zakodować, używając dowolnej kombinacji
\n
i\r
wymaganej.źródło
JSON nie zezwala na przerywanie linii dla czytelności.
Najlepszym rozwiązaniem jest skorzystanie z IDE, które zawinie dla Ciebie.
źródło
To naprawdę stare pytanie, ale natknąłem się na to podczas wyszukiwania i myślę, że znam źródło twojego problemu.
JSON nie zezwala na „prawdziwe” znaki nowej linii w swoich danych; mógł jedynie uciec od nowych linii. Zobacz odpowiedź z @YOU . Zgodnie z pytaniem wygląda na to, że próbowałeś uciec przed łamaniem linii w Pythonie na dwa sposoby: używając znaku kontynuacji linii (
"\"
) lub używając"\n"
znaku ucieczki.Pamiętaj jednak: jeśli używasz ciągu znaków w pythonie, specjalne znaki specjalne (
"\t"
,"\n"
) są tłumaczone na PRAWDZIWE znaki sterujące! The"\n"
Zostaną zastąpione znakiem kontrolnym ASCII reprezentujący znak nowej linii, która jest właśnie znak, że jest nielegalne w JSON. (Jeśli chodzi o znak kontynuacji linii, po prostu usuwa on nową linię).Musisz więc zapobiec ucieczce znaków w Pythonie. Możesz to zrobić, używając nieprzetworzonego ciągu (umieszczonego
r
przed ciągiem, jak wr"abc\ndef"
, lub dodając dodatkowy ukośnik przed znakiem nowej linii ("abc\\ndef"
).Oba powyższe zamiast zastąpić
"\n"
prawdziwym znakiem kontrolnym ASCII nowej linii, pozostaną"\n"
jako dwa dosłowne znaki, które następnie JSON może interpretować jako znak nowej linii.źródło
Zapisz wartość właściwości jako tablicę ciągów. Jak przykład podany tutaj https://gun.io/blog/multi-line-strings-in-json/ . To pomoże.
Zawsze możemy użyć tablicy ciągów dla ciągów wielowierszowych, takich jak następujące.
I możemy z łatwością iterować tablicę, aby wyświetlać zawartość w sposób wieloliniowy.
źródło
Użyj json5 (moduł ładujący) patrz https://json5.org/ - przykład (autor: json5)
źródło
Czy w JSON jest możliwe ciągi wieloliniowe?
Tak. Właśnie przetestowałem to teraz w przeglądarce Firefox, naciskając klawisz F12, klikając konsolę i pisząc u dołu ekranu.
Obiekt x został właśnie utworzony z ciągu formatu JSON zawierającego ciąg wielu wierszy.
Wyświetlany jest x. tekst pokazujący, że jest to ciąg wieloliniowy.
Te dwa testy pokazują, że interpreter JavaScript Firefoksa chętnie tworzy i używa JSON z ciągami wielowierszowymi.
Więcej testów z
JSON.stringify
iJSON.parse
pokazało, że interpreter Javascript może konwertować obiekt zawierający wielowierszowe łańcuchy do JSON i parsować go ponownie bez żadnego problemu.W przeszłości przechowywałem pełne dzieła Szekspira jako właściwość w obiekcie JSON, a następnie przesyłałem je przez Internet, bez szwanku.
Przykład
Oto ciąg dwóch linii wprowadzony przez trzy linie
Możemy wyświetlić obiekt
dający
lub ciąg
dający
Koniec linii w łańcuchu wynika z użycia \ n, a wiele linii wejściowych jest uzyskiwanych za pomocą \ tylko na końcu linii.
W praktyce możesz zsynchronizować zakończenia linii z zakończeniami w łańcuchu, np
Długość sznurka wieloliniowego
Zauważ, że ciąg z nową linią nie jest dłuższy niż ciąg ze spacją. Mimo że na klawiaturze wpisano dwa znaki („\” i „n”), w ciągu jest przechowywany tylko jeden znak.
źródło
x={"a":NaN}
ix={"a":"a \<literal newline with SHIFT>b"}
, które nie są JSON, ale są JavaScriptUżyj regex, aby zastąpić wszystkie wystąpienia
\r\n
z\\n
.To działało dla mnie w scala.
źródło
Jeśli chcesz korzystać z Node.js, możesz to zrobić:
możesz zaimportować za pomocą Node.js i łatwo przekonwertować go na JSON:
i dostajesz:
jak to działa : używasz Node.js, aby załadować moduł JS, który tworzy obiekt JS, który można łatwo łączyć w JSON przez Node.js. Opcja -e ocenia ciąg znaków, a
-p
opcja echa zwraca wynik ostatniej operacji Node.js na standardowe wyjście.Jeśli chcesz załadować skrypt .js, który znajduje się w innym katalogu roboczym, musisz przełączyć ciągi „” i „”:
źródło
Spróbuj użyć
base64
zakodowanej wartości ciągu. Pracował dla mnie przez większość czasu.po
base64
zakodowanym ciągu wyglądaKodowanie i dekodowanie base64 jest dostępne we wszystkich językach.
źródło
umieść tekst wielowierszowy w pliku txt, a następnie
(działa na mongoDB)
źródło
cat
.