Une valeur JSON peut-elle contenir une chaîne multiligne

114

J'écris un fichier JSON qui serait lu par un programme Java. Le fragment est le suivant ...

{
  "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
la source
4
duplication possible de chaînes Multiline en JSON
Courses de légèreté en orbite
17
Je pense que cela concerne davantage la lisibilité du fichier JSON sérialisé et non les sauts de ligne dans les données chargées (donc, pas un duplicata de chaînes Multiline dans JSON ). Pensez-y plutôt à l'utilisation de JSON en tant que fichier de configuration dans lequel vous avez une longue chaîne et, pour plus de lisibilité, il est utile d'envelopper la chaîne au cas où quelqu'un la modifierait via un éditeur de texte.
zashu
2
@zashu: La plupart des éditeurs de texte ont une fonction soft-wrap. C'est immédiatement plus utile qu'une largeur de ligne codée en dur.
Courses de légèreté en orbite le
4
@LightnessRacesinOrbit exécuter git diffs (ou résoudre les conflits de fusion) sur des fichiers avec de telles longues lignes est également une douleur.
Hubert Kario
1
C'est une dupe d'une chaîne Multiline en JSON, citant la question de l'OP: " Est-il possible d'avoir des chaînes multilignes en JSON? C'est principalement pour le confort visuel, donc je suppose que je peux simplement activer le retour à la ligne dans mon éditeur, mais je 'I'm just kinda curious ... "
Andre Figueiredo

Réponses:

61

Consultez les spécifications ! La grammaire de JSON omble de production peut prendre les valeurs suivantes:

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

Les retours à la ligne sont des "caractères de contrôle" donc non, vous ne pouvez pas avoir de nouvelle ligne littérale dans votre chaîne. Cependant, vous pouvez l'encoder en utilisant n'importe quelle combinaison de \net dont \rvous avez besoin.

L' outil JSONLint confirme que votre JSON n'est pas valide.


Mise à jour: Et si vous souhaitez écrire des nouvelles lignes dans votre syntaxe JSON sans réellement inclure les nouvelles lignes dans les données, vous n'avez même pas doublement de chance. Bien que JSON soit censé être convivial dans une certaine mesure, il s'agit toujours de données et vous essayez d'appliquer une mise en forme arbitraire à ces données. Ce n'est absolument pas le but de JSON.

Courses de légèreté en orbite
la source
32

Je ne suis pas sûr de votre exigence exacte, mais une solution possible pour améliorer la «lisibilité» est de la stocker sous forme de tableau.

{
  "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."]
    }
  }
}

}

Rejoignez à nouveau chaque fois que nécessaire avec

result.join(" ")
Brian McAuliffe
la source
13
Ce n'est pas sémantique cependant. C'est une fuite d'abstraction. Je considérerais un format de données spécifié de cette manière comme essentiellement cassé.
Courses de légèreté en orbite
4
Je ne peux pas imaginer concevoir un document API ou JSON de cette façon juste pour augmenter la lisibilité des chaînes (uniquement pour des raisons de débogage, je suppose): | ....
Adam Dyga
"Je considérerais un format de données spécifié de cette manière comme essentiellement cassé." Considérez que c'est pour un cas de test, cependant. Si vous souhaitez coder en dur des chaînes, vous souhaitez probablement un fichier de propriétés. Personnellement, je ne conserverais pas de données «réelles» dans JSON dans des circonstances normales. Mais si c'est un moyen simple de passer de aucun test à des tests, alors allez-y.
sf_jeff
@AdamDyga en fait cela pourrait être utile pour stocker les fichiers json dans un CVS, où l'unité de delta est la ligne.
yota
7

Ce n'est pas une très bonne solution, mais vous pouvez essayer l' outil hjson . Lien . Il vous permet d'écrire du texte sur plusieurs lignes dans l'éditeur, puis de le convertir au format JSON valide approprié. Remarque: il ajoute des caractères '\ n' pour les nouvelles lignes, mais vous pouvez simplement les supprimer dans n'importe quel éditeur de texte avec la fonction "Tout remplacer ..".

PS Devrait être un commentaire sur la question, mais je n'ai pas assez de repo, désolé.

CodeMonkey
la source
C'est une bonne idée en fait. Contrôlez la version du Hjson et faites-le transpiler en JSON si nécessaire.
Courses de légèreté en orbite
3

Comme j'ai pu le comprendre, la question n'est pas de savoir comment passer une chaîne avec des symboles de contrôle à l'aide, jsonmais comment stocker et restaurer json dans un fichier où vous pouvez diviser une chaîne avec des symboles de contrôle de l'éditeur.

Si vous souhaitez stocker une chaîne multiligne dans un fichier, votre fichier ne stockera pas l' jsonobjet valide . Mais si vous utilisez vos jsonfichiers uniquement dans votre programme, vous pouvez stocker les données comme vous le souhaitez et supprimer manuellement toutes les nouvelles lignes du fichier chaque fois que vous le chargez dans votre programme, puis passez à l'analyseur JSON.

Ou bien, ce qui serait mieux, vous pouvez avoir vos jsonfichiers de source de données où vous éditez une piqûre comme vous le souhaitez, puis supprimez toutes les nouvelles lignes avec un utilitaire dans le jsonfichier valide que votre programme utilisera.

JustAnotherCurious
la source
2

Je pense que cela dépend de l'interpréteur json que vous utilisez ... en javascript, vous pouvez utiliser des terminateurs de ligne

{
  "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
la source
C'est correct, mais les espaces d'indentation afficheront: a\ c=> a c.
Andre Figueiredo
1
JavaScript n'a pas d '"interpréteur JSON" qui accepterait cela. Il ne peut prendre JSON que dans une chaîne. Certes, si vous avez fourni JSON dans une chaîne littérale, vous pouvez adopter cette approche, mais c'est une chose inhabituelle à faire. Confondez-vous JSON avec des déclarations d'objet réelles en JavaScript?
Courses de légèreté en orbite