it-swarm.com.de

Mehrzeilige Zeichenfolgen in JSON

Ich schreibe einige Datendateien im JSON-Format und möchte einige sehr lange Zeichenfolgenwerte haben, die auf mehrere Zeilen aufgeteilt sind. Mit dem JSON-Modul von python bekomme ich eine Menge Fehler, egal ob ich \ oder \n als Escape benutze. 

Ist es möglich, mehrzeilige Zeichenfolgen in JSON zu haben? Es ist hauptsächlich für den visuellen Komfort gedacht, also denke ich, dass ich Word Wrap in meinem Editor einschalten kann, aber ich bin nur ein bisschen neugierig ...

466
Anonnobody

JSON erlaubt keine echten Zeilenumbrüche. Sie müssen alle Zeilenumbrüche durch \n ersetzen.

z.B: 

"first line second line"

kann gespeichert werden mit:

"first line\nsecond line"

Hinweis:

für Python sollte dies wie folgt geschrieben werden:

"first line\\nsecond line"

wo \\ für die Escape-Funktion des Backslashs steht, andernfalls behandelt Python \n als das Steuerzeichen "Neue Zeile".

310
YOU

Ich musste dies für ein kleines Node.js-Projekt tun und fand diese Problemumgehung :

{
 "modify_head": [

  "<script type='text/javascript'>",
  "<!--",
  "  function drawSomeText(id) {",
  "  var pjs = Processing.getInstanceById(id);",
  "  var text = document.getElementById('inputtext').value;",
  "  pjs.drawText(text);}",
  "-->",
  "</script>"

 ],

 "modify_body": [

  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"

 ],
}

Das sieht für mich recht ordentlich aus, davon habe ich überall Anführungszeichen. Ansonsten könnte ich vielleicht YAML verwenden, aber das hat andere Fallstricke und wird nicht nativ unterstützt. Einmal analysiert, verwende ich einfach myData.modify_head.join('\n') oder myData.modify_head.join(), abhängig davon, ob ich nach jedem String einen Zeilenumbruch machen möchte oder nicht.

171
errordeveloper

Check out die Spezifikation ! Die Produktion der JSON-Grammatik char kann die folgenden Werte annehmen:

  • ein beliebiges Unicode-Zeichen außer -"- oder -\- oder-Steuerzeichen
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \uvier-hexadezimal

Zeilenumbrüche sind "Steuerzeichen". Nein, Sie haben möglicherweise keine wörtliche Zeilenumbrüche in Ihrer Zeichenfolge. Sie können die Codierung jedoch mit der gewünschten Kombination aus \n und \r codieren.

Dies ist eine wirklich alte Frage, aber ich bin auf eine Suche gestoßen und ich glaube, ich kenne die Ursache Ihres Problems.

JSON erlaubt keine "echten" Zeilenumbrüche in seinen Daten. es kann nur Zeilenumbrüchen entgangen sein. Siehe Antwort aus @YOU . Der Frage zufolge sieht es so aus, als hätten Sie in Python auf zwei Arten versucht, Zeilenumbrüche zu umgehen: Verwenden Sie das Zeilenfortsetzungszeichen ("\") oder verwenden Sie "\n" als Escapezeichen.

Beachten Sie jedoch: Wenn Sie in Python eine Zeichenfolge verwenden, werden spezielle Escape-Zeichen ("\t", "\n") in REAL-Steuerzeichen übersetzt! "\n" wird durch das Steuerzeichen ASCII ersetzt, das ein Zeilenvorschubzeichen darstellt. Dies ist genau das Zeichen, das in JSON nicht zulässig ist. (Was das Zeilenfortsetzungszeichen betrifft, wird einfach die Zeilenumbrüche herausgenommen.)

Sie müssen also verhindern, dass Python Zeichen entgeht. Sie können dies tun, indem Sie eine unformatierte Zeichenfolge verwenden (setzen Sie r vor die Zeichenfolge, wie in r"abc\ndef"), oder indem Sie einen zusätzlichen Schrägstrich vor der Zeilenvorschubzeile ("abc\\ndef") einfügen.

Anstelle von "\n" durch das Steuerzeichen für echte Zeilenumbrüche ASCII wird "\n" als zwei Literalzeichen verwendet, die von JSON als Newline-Escape interpretiert werden können.

34
HardlyKnowEm

JSON erlaubt aus Gründen der Lesbarkeit keine Zeilenumbrüche.

Am besten verwenden Sie eine IDE, die für Sie Zeilenumbruch darstellt.

31
James Gentes

Leider beziehen sich viele der Antworten hier auf die Frage, wie ein Newline-Zeichen in die String-Daten eingefügt werden kann. Die Frage ist, wie Sie den Code schöner aussehen lassen, indem Sie den String-Wert auf mehrere Codezeilen aufteilen. (Und selbst die Antworten, die dies erkennen, liefern "Lösungen", die davon ausgehen, dass man die Darstellung der Daten frei ändern kann, was in vielen Fällen nicht der Fall ist.)

Und die schlechtere Nachricht ist, dass es keine gute Antwort gibt.

In vielen Programmiersprachen können Sie die Zeichenfolgenverkettung auch dann verwenden, wenn sie das Aufteilen von Zeichenfolgen über Zeilen nicht explizit unterstützen, um den gewünschten Effekt zu erzielen. 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 sagen, dass Zeichenketten verkettet werden sollen. Ihre (relativ kleine) Grammatik enthält auch keine Möglichkeit, eine Zeichenfolge in mehreren Zeilen darzustellen.

Abgesehen davon, dass ich einen Pre-Prozessor entwickelt habe (und ich selbst habe nicht das Gefühl, meine eigene Sprache zu entwickeln, 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 Strings ersetzen. Ansonsten ist dies eine der zahlreichen Möglichkeiten, mit denen json nicht für die Lesbarkeit von Menschen konzipiert ist.

18

Eigenschaftswert als ein String-Array schreiben. Wie hier gegebenes Beispiel https://gun.io/blog/multi-line-strings-in-json/ . Das wird helfen.

Wir können immer ein Array von Strings für mehrzeilige Strings wie folgt verwenden.

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

Und wir können das Array leicht iterieren, um den Inhalt mehrzeilig darzustellen.

11
Sandip Nirmal

Ist es möglich, mehrzeilige Zeichenfolgen in JSON zu haben?

Ja. Ich habe dies gerade mit meinem Firefox-Webbrowser getestet, indem ich die Taste F12 drückte, auf die Konsole klickte und unten im Bildschirm tippte.

x={text:"hello\nworld"}

Das Objekt x wurde gerade aus einer JSON-Formatzeichenfolge erstellt, die eine mehrzeilige Zeichenfolge enthält.

console.log(x.text)
hello
world

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 Zeichenketten erstellt und verwendet.

Weitere Tests mit JSON.stringify und JSON.parse zeigten, dass der Javascript-Interpreter ein Objekt, das mehrzeilige Zeichenfolgen enthält, in JSON konvertieren und dieses problemlos wieder analysieren kann.

Ich habe in der Vergangenheit die kompletten Werke von Shakespeare als Eigentum in einem JSON-Objekt gespeichert und anschließend unbeschädigt über das Internet gesendet.

Beispiel

Hier ist eine zweizeilige Zeichenfolge, die über drei Zeilen eingegeben wird

x={text:"expert\
s\nex\
change"}

Wir können das Objekt anzeigen

console.log(x)

geben 

Object { text: "experts\nexchange" }

oder die Zeichenfolge

console.log(x.text)

geben 

experts
exchange

Das Zeilenende in der Zeichenfolge resultiert aus der Verwendung von\n Und die mehreren Eingabezeilen werden nur mit\am Zeilenende erreicht.

In der Praxis sollten Sie Ihre Zeilenenden mit denen in der Zeichenfolge synchronisieren, z.

x={text:"experts\n\
exchange"}

Multi-Line String Länge

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11

Beachten Sie, dass die Zeichenfolge mit dem Zeilenvorschub nicht länger ist als die Zeichenfolge mit dem Leerzeichen. Obwohl auf der Tastatur zwei Zeichen eingegeben wurden ('\' und 'n'), wird nur ein Zeichen in der Zeichenfolge gespeichert.

11
user3070485

Verwenden Sie regex, um alle Vorkommen von \r\n durch \\n zu ersetzen.

Das hat für mich in Scala funktioniert.

val newstr = str.replace("\r\n", "\\n")
9
Sikander

Wenn Sie bereit sind, Node.js zu verwenden, können Sie dies tun:

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

sie können mit Node.js importieren und es einfach wie folgt in JSON konvertieren:

echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`

und du bekommst:

{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}

wie es funktioniert : Sie verwenden Node.js, um ein JS-Modul zu laden, das ein JS-Objekt erstellt, das von Node.js leicht mit JSON-Zeichen versehen werden kann. Die Option -e wertet die Zeichenfolge aus, und die Option -p gibt das Rückgabeergebnis der letzten Node.js-Operation an stdout zurück.

Wenn Sie ein .js-Skript laden möchten, das sich in einem anderen Arbeitsverzeichnis befindet, müssen Sie die Zeichenfolgen "" und '' wechseln:

my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
1
Alexander Mills

Verwenden Sie json5 (loader) siehe https://json5.org/ - Beispiel (von json5)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}
0
Lacom