954 votes

Les chaînes de caractères multilignes sont-elles autorisées en JSON ?

Est-il possible d'avoir des chaînes multi-lignes en JSON ?

C'est surtout pour le confort visuel donc je suppose que je peux simplement activer le retour à la ligne dans mon éditeur, mais je suis juste un peu curieux.

Je suis en train d'écrire des fichiers de données au format JSON et j'aimerais avoir des valeurs de chaîne très longues réparties sur plusieurs lignes. En utilisant le module JSON de Python, j'obtiens un grand nombre d'erreurs, que j'utilise \ ou \n comme échappement.

4 votes

Organisez vos données : divisez la chaîne multiligne en un tableau de chaînes, puis joignez-les plus tard.

3 votes

Essayez l'outil hjson. Il convertira votre chaîne multiligne en json au format json correct.

1 votes

570voto

YOU Points 44812

JSON ne permet pas de sauts de ligne réels. Vous devez remplacer tous les sauts de ligne par \n.

par exemple:

"première ligne
deuxième ligne"

peut être enregistré avec:

"première ligne\ndeuxième ligne"

Note:

pour Python, cela devrait être écrit comme suit:

"première ligne\\ndeuxième ligne"

\\ est pour échapper le backslash, sinon Python va traiter \n comme le caractère de contrôle "nouvelle ligne"

114 votes

-1 L'OP utilise la séquence d'échappement "\n". Cela ne fonctionne pas car ils ne échappent pas le backslash, comme "\\n", donc Python convertit la séquence d'échappement en un caractère de nouvelle ligne au lieu de la laisser littéralement comme un backslash suivi de "n", comme le requiert JSON.

7 votes

@utilisateur359996 Je ne suis pas sûr que ce soit vrai. Pour moi (enregistrer des données en JSON avec juste \n et les afficher via Curses), \n semble fonctionner correctement. Cela dépend du moteur de vue/rendu, il semble.

2 votes

Les séquences de saut de ligne sont effectivement spécifiques à la plate-forme (cf. fr.wikipedia.org/wiki/Saut_de_ligne#Représentations). Cependant, selon la réponse de @Lightness Races in Orbit, ni le retour de chariot ni les caractères de saut de ligne ne sont présents dans la grammaire JSON. Je ne suis en fait pas un programmeur Python, donc je ne sais pas exactement ce qui se passe dans votre cas, mais soit votre analyseur est cassé, soit vous ne lui passez pas ce que vous pensez lui passer. Peut-être que cette réponse l'explique mieux : stackoverflow.com/a/9295597/359996. Notez surtout la partie sur l'échappement double.

236voto

errordeveloper Points 1649

J'ai dû le faire pour un petit projet Node.js et j'ai trouvé cette astuce pour stocker des chaînes multilignes sous forme de tableau de lignes afin de les rendre plus lisibles (avec un coût supplémentaire de code pour les convertir en chaîne plus tard) :

{
 "modify_head": [

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

 ],

 "modify_body": [

  "",
  ""

 ],
}

Une fois analysé, j'utilise simplement myData.modify_head.join('\n') ou myData.modify_head.join(), en fonction de si je veux un saut de ligne après chaque chaîne ou non.

Cela me semble plutôt bien, malgré le fait que je doive utiliser des guillemets partout. Sinon, je pourrais peut-être utiliser YAML, mais cela comporte d'autres pièges et n'est pas pris en charge nativement.

64 votes

Voici une solution pour un paramétrage spécifique, pas nécessairement liée à la question. Ce que vous créez là ne sont pas des chaînes de caractères multilignes (ce qui n'est pas possible de toute façon), mais des tableaux avec des chaînes de caractères à l'intérieur

5 votes

Cela montre comment insérer un saut de ligne dans les chaînes, ce qui NE répond PAS à la question. Cette réponse le fait.

1 votes

Fgrieu - on pourrait tout aussi facilement concaténer les chaînes sans ajouter de saut de ligne. Avec cette petite modification, cela fournit une solution de contournement pour les chaînes multilignes (tant que vous contrôlez la spécification du schéma JSON). Je vais essayer d'améliorer la réponse avec cela.

132voto

Découvrez la spécification! La production char de la grammaire JSON peut prendre les valeurs suivantes:

  • tout-caractère-Unicode-sauf-"-ou-\-ou-caractère-de-contrôle
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u quatre-chiffres-hexadécimaux

Les sauts de ligne sont des "caractères de contrôle" donc, non, vous ne pouvez pas avoir un saut de ligne littéral dans votre chaîne. Cependant, vous pouvez l'encoder en utilisant n'importe quelle combinaison de \n et \r dont vous avez besoin.

0 votes

5 votes

Ceci est la bonne réponse car elle ne laisse place à aucune ambiguïté. Les nouvelles lignes sont autorisées, selon les spécifications, tant qu'elles sont correctement échappées avec le caractère de contrôle.

1 votes

@AliKhaki \n dans JSON ne produira pas le résultat recherché par la question. Soit vous pensez à autre chose (c'est-à-dire incorporer des caractères de nouvelle ligne), soit vous parlez d'un saut de ligne dans une chaîne littérale (contenant du JSON) dans un langage de programmation, ce qui est encore quelque chose de différent.

52voto

mlefavor Points 1379

C'est une question vraiment ancienne, mais je suis tombé dessus lors d'une recherche et je pense que je connais la source de votre problème.

JSON ne permet pas de "vraies" sauts de ligne dans ses données ; il ne peut avoir que des sauts de ligne échappés. Voir la réponse de @YOU. Selon la question, il semble que vous avez essayé d'échapper aux sauts de ligne en Python de deux manières : en utilisant le caractère de continuation de ligne ("\") ou en utilisant "\n" comme échappement.

Mais gardez à l'esprit : si vous utilisez une chaîne de caractères en Python, les caractères échappés spéciaux ("\t", "\n") sont traduits en VRAIS caractères de contrôle ! Le "\n" sera remplacé par le caractère de contrôle ASCII représentant un saut de ligne, qui est précisément le caractère illégal dans JSON. (En ce qui concerne le caractère de continuation de ligne, il supprime simplement le saut de ligne.)

Donc ce que vous devez faire, c'est empêcher Python d'échapper aux caractères. Vous pouvez le faire en utilisant une chaîne brute (mettez r devant la chaîne, comme dans r"abc\ndef", ou en incluant une barre oblique supplémentaire devant le saut de ligne ("abc\\ndef").

Les deux ci-dessus, au lieu de remplacer "\n" par le vrai caractère de contrôle ASCII de saut de ligne, laisseront "\n" en tant que deux caractères littéraux, que JSON peut ensuite interpréter comme un échappement de saut de ligne.

9voto

Sikander Points 1

Utilisez les expressions régulières pour remplacer toutes les occurrences de \r\n par \\\n.

Cela a fonctionné pour moi en scala.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X