Kann ein JSON-Wert eine mehrzeilige Zeichenfolge enthalten?

114

Ich schreibe eine JSON-Datei, die von einem Java-Programm gelesen wird. Das Fragment ist wie folgt ...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}
user2409155
quelle
4
Mögliches Duplikat von Multiline-Strings in JSON
Lightness Races im Orbit
17
Ich denke, hier geht es mehr um die Lesbarkeit der serialisierten JSON-Datei und nicht um Zeilenumbrüche in den geladenen Daten (also nicht um ein Duplikat von mehrzeiligen Zeichenfolgen in JSON ). Stellen Sie sich JSON eher als Konfigurationsdatei vor, in der Sie eine lange Zeichenfolge haben. Aus Gründen der Lesbarkeit ist es hilfreich, die Zeichenfolge fest zu verpacken, falls jemand sie über einen Texteditor bearbeitet.
Zashu
2
@zashu: Die meisten Texteditoren verfügen über eine Soft-Wrap-Funktion. Das ist sofort nützlicher als eine fest codierte Linienbreite.
Leichtigkeitsrennen im Orbit
4
@LightnessRacesinOrbit Das Ausführen von Git-Diffs (oder das Lösen von Zusammenführungskonflikten) für Dateien mit so langen Zeilen ist ebenfalls ein Problem.
Hubert Kario
1
Dies ist ein Betrug einer mehrzeiligen Zeichenfolge in JSON, unter Berufung auf die Frage des OP: " Ist es möglich, mehrzeilige Zeichenfolgen in JSON zu haben? Dies dient hauptsächlich dem visuellen Komfort, sodass ich den Zeilenumbruch in meinem Editor aktivieren kann, aber ich bin nur ein bisschen neugierig ... "
Andre Figueiredo

Antworten:

61

Überprüfen Sie die Spezifikation ! Die JSON Grammatik char Produktion kann die folgenden Werte annehmen:

  • any-Unicode-Zeichen- "außer- \oder-oder-Steuerzeichen
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u vier hexadezimale Ziffern

Zeilenumbrü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 \nund codieren \r.

Das JSONLint- Tool bestätigt, dass Ihr JSON ungültig ist.


Update: Und wenn Sie Zeilenumbrüche in Ihre JSON-Syntax schreiben möchten, ohne tatsächlich Zeilenumbrüche in die Daten aufzunehmen, haben Sie sogar doppelt Pech. Während JSON bis zu einem gewissen Grad menschenfreundlich sein soll, handelt es sich immer noch um Daten, und Sie versuchen , diese Daten mit einer beliebigen Formatierung zu versehen. Darum geht es bei JSON absolut nicht.

Leichtigkeitsrennen im Orbit
quelle
32

Ich bin mir Ihrer genauen Anforderung nicht sicher, aber eine mögliche Lösung zur Verbesserung der Lesbarkeit besteht darin, sie als Array zu speichern.

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

Die machen wieder mit, wann immer es nötig ist

result.join(" ")
Brian McAuliffe
quelle
13
Das ist allerdings unsemantisch. Es ist ein Abstraktionsleck. Ich würde ein auf diese Weise angegebenes Datenformat als im Wesentlichen fehlerhaft betrachten.
Leichtigkeitsrennen im Orbit
4
Ich kann mir nicht vorstellen, ein API- oder JSON-Dokument auf diese Weise zu entwerfen, um die Lesbarkeit von Zeichenfolgen zu verbessern (vermutlich nur aus Debugging-Gründen): | ....
Adam Dyga
"Ich würde ein auf diese Weise angegebenes Datenformat als im Wesentlichen fehlerhaft betrachten." Beachten Sie jedoch, dass dies ein Testfall ist. Wenn Sie Zeichenfolgen fest codieren möchten, benötigen Sie wahrscheinlich eine Eigenschaftendatei. Ich persönlich würde unter normalen Umständen keine "echten" Daten in JSON speichern. Aber wenn dies ein einfacher Weg ist, um von keinen Tests zu Tests zu gelangen, dann versuchen Sie es.
sf_jeff
@AdamDyga in der Tat könnte es nützlich sein, um die JSON-Dateien in einem CVS zu speichern, wobei die Delta-Einheit die Zeile ist.
Yota
7

Keine gute Lösung, aber Sie können das hjson- Tool ausprobieren . Link . Sie können Text im Editor mehrzeilig schreiben und dann in das richtige gültige JSON-Format konvertieren. Hinweis: Es werden '\ n' Zeichen für die neuen Zeilen hinzugefügt, aber Sie können sie einfach in jedem Texteditor mit der Funktion "Alle ersetzen .." löschen.

PS Sollte ein Kommentar zu der Frage sein, aber nicht genug Repo haben, sorry.

CodeMonkey
quelle
Das ist eigentlich eine gute Idee. Versionskontrolle des Hjson und Transpilieren nach Bedarf in JSON.
Leichtigkeitsrennen im Orbit
3

Wie ich verstehen konnte, geht es bei der Frage nicht darum, wie eine Zeichenfolge mit Steuerungssymbolen übergeben wird, jsonsondern darum, wie json in einer Datei gespeichert und wiederhergestellt wird, in der Sie eine Zeichenfolge mit Editor-Steuerungssymbolen teilen können.

Wenn Sie mehrzeilige Zeichenfolgen in einer Datei speichern möchten, wird in Ihrer Datei das gültige jsonObjekt nicht gespeichert . Wenn Sie Ihre jsonDateien jedoch nur in Ihrem Programm verwenden, können Sie die Daten wie gewünscht speichern und alle Zeilenumbrüche jedes Mal manuell aus der Datei entfernen, wenn Sie sie in Ihr Programm laden und dann an den json-Parser übergeben.

Alternativ, was besser wäre, können Sie Ihre jsonDatenquellendateien haben, in denen Sie einen Stich wie gewünscht bearbeiten und dann alle neuen Zeilen mit einem Dienstprogramm aus der gültigen jsonDatei entfernen, die Ihr Programm verwenden wird.

JustAnotherCurious
quelle
2

Ich glaube, es hängt davon ab, welchen JSON-Interpreter Sie verwenden ... in einfachem Javascript könnten Sie Zeilenabschlusszeichen verwenden

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}
Elric Best
quelle
Dies ist korrekt, aber Einrückungsfelder geben Folgendes aus: a\ c=> a c.
Andre Figueiredo
1
JavaScript hat keinen "JSON-Interpreter", der dies akzeptieren würde. Es kann nur JSON in einer Zeichenfolge aufnehmen. Wenn Sie JSON in einem String-Literal angegeben haben, können Sie diesen Ansatz wählen, aber das ist ungewöhnlich. Verwechseln Sie JSON mit tatsächlichen Objektdeklarationen in JavaScript?
Leichtigkeitsrennen im Orbit