410 Stimmen

Wie behandle ich Zeilenumbrüche in JSON?

Ich habe einige JSON generiert und ich versuche, es in ein Objekt in JavaScript zu ziehen. Ich erhalte ständig Fehler. Hier ist, was ich habe:

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = eval('('+data+')');

Dies führt zu einer Fehlermeldung:

unterminated string literal

Mit JSON.parse(data) erhalte ich ähnliche Fehlermeldungen: " Unexpected token " in Chrome, und " unterminated string literal " in Firefox und IE.

Wenn ich die Karte herausnehme \n nach sometext der Fehler verschwindet in beiden Fällen. Ich kann nicht herausfinden, warum die \n macht eval y JSON.parse scheitern.

490voto

BlaM Punkte 27550

Das ist es, was Sie wollen:

var data = '{"count" : 1, "stack" : "sometext\\n\\n"}';

Sie müssen aus dem \ in der Zeichenkette (und verwandelt sie in eine Doppel- \ ), andernfalls wird es ein Zeilenumbruch in der JSON-Quelle, nicht in den JSON-Daten.

65voto

manish_s Punkte 5300

Sie müssen eine Funktion haben, die Folgendes ersetzt \n a \\n im Falle data kein String-Literal ist.

function jsonEscape(str)  {
    return str.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t");
}

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = JSON.parse(jsonEscape(data));

Das Ergebnis dataObj wird sein

Object {count: 1, stack: "sometext\n\n"}

39voto

Marinos An Punkte 7473

TLDR: Eine Lösung für das Problem des Autors.

Verwenden Sie String.raw wörtlich:

var data = String.raw`{"count" : 1, "stack" : "sometext\n\n"}`;

Aus irgendeinem Grund konzentrieren sich alle Antworten hier auf das Parsen einer JSON-Zeichenfolgendarstellung in JavaScript, was zu Verwirrung darüber führen kann, wie man Zeilenumbrüche in JSON darstellt. Letzteres ist nicht sprachabhängig.

Streng nach dem Titel der Frage:

Wie behandle ich Zeilenumbrüche in JSON?

Nehmen wir an, Sie parsen eine JSON-Datei mit dem folgenden Code in node (es könnte allerdings jede Sprache sein):

let obj = JSON.parse(fs.readFileSync('file.json'));
console.log(obj.mykey)

Nachfolgend ist die Ausgabe für jeden der möglichen Inhalte von file.json :

Eingang 1:

{
  "mykey": "my multiline
   value"
}

Ausgang 1:

SyntaxError: Unexpected token

Eingabe 2:

{
  "mykey": "my multiline\nvalue"
}

Ausgang 2:

my multiline
value

Eingabe 3:

{
  "mykey": "my multiline\\nvalue"
}

Ausgang 3:

my multiline\nvalue

Schlussfolgerung 1:

Zur Darstellung eines Zeilenumbruchs innerhalb einer json Datei sollten wir die \n Zeichen . Zur Darstellung der \n sollten wir \\n .


Wie würden wir jede der oben genannten Eingaben mit JavaScript (anstelle einer Eingabedatei) definieren?

Wenn wir eine Zeichenkette, die JSON enthält, in JavaScript definieren müssen, ändern sich die Dinge ein wenig aufgrund der besonderen Bedeutung, die \n hat auch für JavaScript. Beachten Sie aber auch, wie String.raw Buchstäblich behebt dies .

Eingabe1:

let input1 = '{"mykey": "my multiline\nvalue"}'

//OR
let input1 = `{
  "mykey": "my multiline
   value"
}`;

//OR
let input1 = String.raw`{
  "mykey": "my multiline
   value"
}`;

console.log(JSON.parse(input1).mykey);

//SyntaxError: Unexpected token
//in JSON at position [..]

Eingabe 2:

let input2 = '{"mykey": "my multiline\\nvalue"}'

//OR
let input2 = `{
  "mykey": "my multiline\\nvalue"
}`;

//OR (Notice the difference from default literal)
let input2 = String.raw`{
  "mykey": "my multiline\nvalue"
}`;

console.log(JSON.parse(input2).mykey);

//my multiline
//value

Eingabe 3 :

let input3 = '{"mykey": "my multiline\\\\nvalue"}'

//OR
let input3 = `{
  "mykey": "my multiline\\\\nvalue"
}`;

//OR (Notice the difference from default literal)
let input3 = String.raw`{
  "mykey": "my multiline\\nvalue"
}`;

console.log(JSON.parse(input3).mykey);

//my multiline\nvalue

Schlussfolgerung 2:

Zur Definition einer json Zeichenkette in javascript die Der einfachste Weg wäre die Verwendung von String.raw weil es kein Escaping benötigt (abgesehen vom Backtick, der wie folgt escaped wird String.raw`abc${"`"}def` ).

Natürlich ist es am einfachsten, die json in Javascript ist im Allgemeinen die Umwandlung eines Javascript-Objekts in json (mit JSON.stringify ).

14voto

gavenkoa Punkte 40749

Gemäß der Spezifikation, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf :

Eine Zeichenkette ist eine Folge von Unicode-Codepunkten, die mit Anführungszeichen umschlossen sind ( U+0022 ). Alle Zeichen können innerhalb der Anführungszeichen platziert werden, mit Ausnahme der Zeichen, die escaped werden müssen: Anführungszeichen ( U+0022 ), umgekehrter Solidus ( U+005C ), und die Steuerzeichen U+0000 a U+001F . Es gibt Zwei-Zeichen Escape-Sequenz-Darstellungen für einige Zeichen.

Sie können also nicht bestehen 0x0A o 0x0C Codes direkt. Das ist verboten! Die Spezifikation schlägt die Verwendung von Escape-Sequenzen für einige wohldefinierte Codes aus U+0000 a U+001F :

  • \f steht für das Formularvorschubzeichen ( U+000C ).
  • \n steht für das Zeilenvorschubzeichen ( U+000A ).

Wie die meisten Programmiersprachen verwenden \ für die Anführungszeichen sollten Sie die Escape-Syntax verwenden (doppeltes Escape - einmal für Sprache/Plattform, einmal für JSON selbst):

jsonStr = "{ \"name\": \"Multi\\nline.\" }";

5voto

jerryurenaa Punkte 2450

Nun, es ist nicht wirklich notwendig, eine Funktion dafür zu erstellen, wenn es einfach mit 1 CSS-Klasse gemacht werden kann.

wickeln Sie einfach Ihren Text um diese Klasse und sehen Sie die Magie :D

 <p style={{whiteSpace: 'pre-line'}}>my json text goes here \n\n</p>

Hinweis: Da Sie Ihren Text im Frontend immer mit HTML darstellen werden, können Sie den style={{whiteSpace: 'pre-line'}} zu jedem Tag hinzufügen, nicht nur zum p-Tag.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X