Ich schreibe einige Datendateien im JSON-Format und möchte einige wirklich lange Zeichenfolgenwerte über mehrere Zeilen verteilt haben. Mit dem JSON-Modul von Python erhalte ich viele Fehler, egal ob ich es benutze \
oder \n
als Escape.
Ist es möglich, mehrzeilige Zeichenfolgen in JSON zu haben? Es dient hauptsächlich dem visuellen Komfort, also kann ich wohl den Zeilenumbruch in meinem Editor aktivieren, aber ich bin nur ein bisschen neugierig ...
Antworten:
JSON erlaubt keine echten Zeilenumbrüche. Sie müssen alle Zeilenumbrüche durch ersetzen
\n
.z.B:
"first line second line"
kann gespeichert werden mit:
"first line\nsecond line"
Hinweis:
denn
Python
dies sollte geschrieben werden als:"first line\\nsecond line"
wo
\\
ist für das Entkommen des Backslash, sonst behandelt Python\n
als Steuerzeichen "neue Zeile"quelle
\n
und über Curses ausgeben)\n
scheint das in Ordnung zu sein. Es hängt anscheinend von der Ansichts- / Rendering-Engine ab.Ich habe dies für ein kleines Node.js Projekt zu tun und fanden diese Behelfslösung :
Das sieht für mich ganz ordentlich aus, abgesehen davon muss ich überall doppelte Anführungszeichen verwenden. Ansonsten könnte ich vielleicht YAML verwenden, aber das hat andere Fallstricke und wird von Haus aus nicht unterstützt. Einmal analysiert, verwende ich einfach
myData.modify_head.join('\n')
odermyData.modify_head.join()
, je nachdem, ob ich nach jedem String einen Zeilenumbruch möchte oder nicht.quelle
Leider befassen sich viele der Antworten hier mit der Frage, wie ein Zeilenumbruchzeichen in die Zeichenfolgendaten eingefügt werden soll. Die Frage ist, wie der Code schöner aussehen kann, indem der Zeichenfolgenwert auf mehrere Codezeilen aufgeteilt wird. (Und selbst die Antworten, die dies erkennen, bieten "Lösungen", bei denen davon ausgegangen wird, dass man die Datendarstellung ändern kann, was in vielen Fällen nicht der Fall ist.)
Und die schlimmste Nachricht ist, dass es keine gute Antwort gibt.
In vielen Programmiersprachen können Sie die Zeichenfolgenverkettung verwenden, um den gewünschten Effekt zu erzielen, auch wenn sie das Aufteilen von Zeichenfolgen über Zeilen nicht explizit unterstützen. und solange der Compiler nicht schrecklich ist, ist das in Ordnung.
Aber json ist keine Programmiersprache; Es ist nur eine Datendarstellung. Sie können nicht festlegen, dass Zeichenfolgen verkettet werden sollen. Die (ziemlich kleine) Grammatik enthält auch keine Möglichkeit, eine Zeichenfolge in mehreren Zeilen darzustellen.
Ohne einen Vorprozessor zu entwickeln (und ich habe nicht das Gefühl, meine eigene Sprache effektiv zu erfinden, um dieses Problem zu lösen), gibt es keine allgemeine Lösung für dieses Problem. Wenn Sie das Datenformat ändern können, können Sie ein Array von Zeichenfolgen ersetzen. Andernfalls ist dies eine der zahlreichen Möglichkeiten, mit denen json nicht für die menschliche Lesbarkeit ausgelegt ist.
quelle
Überprüfen Sie die Spezifikation ! Die JSON Grammatik char Produktion kann die folgenden Werte annehmen:
"
außer-\
oder-oder-Steuerzeichen\"
\\
\/
\b
\f
\n
\r
\t
\u
vier hexadezimale ZiffernZeilenumbrüche sind "Steuerzeichen". Nein, Sie haben möglicherweise keinen wörtlichen Zeilenumbruch in Ihrer Zeichenfolge. Sie können es jedoch mit einer beliebigen Kombination von
\n
und codieren\r
.quelle
JSON erlaubt keine Zeilenumbrüche zur besseren Lesbarkeit.
Am besten verwenden Sie eine IDE, die den Zeilenumbruch für Sie übernimmt.
quelle
Dies ist eine wirklich alte Frage, aber ich bin bei einer Suche darauf gestoßen und glaube, ich kenne die Ursache Ihres Problems.
JSON erlaubt keine "echten" Zeilenumbrüche in seinen Daten. es kann nur Zeilenumbrüchen entkommen sein. Siehe die Antwort von @YOU . Der Frage zufolge haben Sie in Python auf zwei Arten versucht, Zeilenumbrüche zu umgehen: mithilfe des Zeilenfortsetzungszeichens (
"\"
) oder"\n"
als Escapezeichen.Beachten Sie jedoch: Wenn Sie eine Zeichenfolge in Python verwenden, werden Sonderzeichen (
"\t"
,"\n"
) in REAL-Steuerzeichen übersetzt! Das"\n"
wird durch das ASCII-Steuerzeichen ersetzt, das ein Zeilenumbruchzeichen darstellt. Dies ist genau das Zeichen, das in JSON unzulässig ist. (Das Zeilenfortsetzungszeichen nimmt einfach die neue Zeile heraus.)Sie müssen also verhindern, dass Python Zeichen entkommt. Sie können dies tun, indem Sie eine rohe Zeichenfolge verwenden (wie
r
in vor die Zeichenfolge setzenr"abc\ndef"
oder einen zusätzlichen Schrägstrich vor die neue Zeile einfügen ("abc\\ndef"
).Beide oben
"\n"
genannten Zeichen werden nicht durch das echte ASCII-Steuerzeichen für Zeilenumbrüche ersetzt, sondern"\n"
als zwei Literalzeichen, die JSON dann als Zeilenumbruch interpretieren kann.quelle
Schreiben Sie den Eigenschaftswert als Array von Zeichenfolgen. Wie hier angegebenes Beispiel https://gun.io/blog/multi-line-strings-in-json/ . Das wird helfen.
Wir können immer ein Array von Zeichenfolgen für mehrzeilige Zeichenfolgen wie die folgenden verwenden.
Und wir können das Array leicht iterieren, um Inhalte mehrzeilig anzuzeigen.
quelle
Verwenden Sie json5 (Loader), siehe https://json5.org/ - Beispiel (von json5)
quelle
Ist es möglich, mehrzeilige Zeichenfolgen in JSON zu haben?
Ja. Ich habe dies jetzt mit meinem Firefox-Webbrowser getestet, indem ich F12 gedrückt, auf Konsole geklickt und am unteren Bildschirmrand eingegeben habe.
Objekt x wurde gerade aus einer Zeichenfolge im JSON-Format erstellt, die eine mehrzeilige Zeichenfolge enthält.
x.text wird angezeigt und zeigt an, dass es sich um eine mehrzeilige Zeichenfolge handelt.
Diese beiden Tests zeigen, dass der Javascript-Interpreter von Firefox gerne JSON mit mehrzeiligen Zeichenfolgen erstellt und verwendet.
Weitere Tests mit
JSON.stringify
undJSON.parse
zeigten, dass der Javascript-Interpreter ein Objekt mit mehrzeiligen Zeichenfolgen in JSON konvertieren und problemlos wieder analysieren kann.Ich habe in der Vergangenheit die gesamten Werke von Shakespeare als Eigentum in einem JSON-Objekt gespeichert und sie dann unverfälscht über das Internet gesendet.
Beispiel
Hier ist eine zweizeilige Zeichenfolge, die über drei Zeilen eingegeben wird
Wir können das Objekt anzeigen
geben
oder die Zeichenfolge
geben
Das Zeilenende in der Zeichenfolge ergibt sich aus der Verwendung von \ n, und die mehreren Eingabezeilen werden mit nur \ am Zeilenende erreicht.
In der Praxis möchten Sie möglicherweise Ihre Zeilenenden mit denen in der Zeichenfolge synchronisieren, z
Mehrzeilige Stringlänge
Beachten Sie, dass die Zeichenfolge mit dem Zeilenumbruch nicht länger ist als die Zeichenfolge mit dem Leerzeichen. Obwohl zwei Zeichen auf der Tastatur eingegeben wurden ('\' und 'n'), wird nur ein Zeichen in der Zeichenfolge gespeichert.
quelle
x={"a":NaN}
undx={"a":"a \<literal newline with SHIFT>b"}
, die nicht JSON sind, sondern JavaScriptVerwenden Sie Regex, um alle Vorkommen von
\r\n
durch zu ersetzen\\n
.Das hat bei mir in Scala funktioniert.
quelle
Wenn Sie bereit sind, Node.js zu verwenden, können Sie dies tun:
Sie können mit Node.js importieren und es einfach wie folgt in JSON konvertieren:
und du bekommst:
So funktioniert es : Sie verwenden Node.js, um ein JS-Modul zu laden, das ein JS-Objekt erstellt, das von Node.js leicht mit JSON-Zeichenfolgen versehen werden kann. Die Option -e wertet die Zeichenfolge aus, und die
-p
Option gibt das Rückgabeergebnis der letzten Node.js-Operation an stdout wieder.Wenn Sie ein .js-Skript laden möchten, das sich in einem anderen Arbeitsverzeichnis befindet, müssen Sie die Zeichenfolgen "" und '' wechseln:
quelle
Versuchen Sie es mit einem
base64
codierten Zeichenfolgenwert. Hat die meiste Zeit für mich gearbeitet.nach
base64
codierten Zeichenfolge aussehen wieDie Base64-Codierung und -Decodierung ist in allen Sprachen verfügbar.
quelle
Setzen Sie den mehrzeiligen Text in die TXT-Datei und dann
(es funktioniert auf mongoDB)
quelle
cat
.