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

J’écris un fichier JSON qui serait lu par un programme Java. Le fragment est comme suit …

{ "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 ssortingng 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" } } } 

Découvrez les spécifications ! La production de caractères de la grammaire JSON peut prendre les valeurs suivantes:

  • any-Unicode-character-except- " -ou–
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u quatre chiffres hexadécimaux

Les nouvelles lignes sont des “caractères de contrôle”, donc non, vous ne pouvez pas avoir de ligne nouvelle dans votre chaîne. Cependant, vous pouvez l’encoder en utilisant n’importe quelle combinaison de \n et \r requirejse.

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


Mise à jour: Et si vous voulez écrire de nouvelles lignes dans votre syntaxe JSON sans inclure de nouvelles lignes dans les données, alors vous avez même plus de chance. Bien que JSON soit conçu pour être humain dans une certaine mesure, il s’agit toujours de données et vous essayez d’appliquer un formatage arbitraire à ces données. Ce n’est absolument pas ce dont parle JSON.

Je ne suis pas sûr de votre exigence exacte, mais une solution possible pour améliorer la «lisibilité» est de la stocker en tant que 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."] } } } } 

Le rejoindre à nouveau chaque fois que nécessaire avec

 result.join(" ") 

Comme je peux le comprendre, la question n’est pas de savoir comment passer une chaîne avec des symboles de contrôle utilisant json mais comment stocker et restaurer json dans un fichier où vous pouvez diviser une chaîne avec des symboles de contrôle d’éditeur.

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

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

Pas très bonne solution, mais vous pouvez essayer l’outil hjson . Lien Il vous permet d’écrire du texte multi-lignes dans l’éditeur puis de le convertir au format JSON correct. 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 “Remplacer tout ..”.

PS Devrait être un commentaire à la question, mais ne pas avoir assez de repo, désolé.

Je crois que cela dépend de quel interpréteur json 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." } } } 

Ceci est implémenté en tant que writer car pour le caractère unique, il pourrait y avoir plusieurs caractères de sortie. Je ne pouvais pas imaginer cela en tant que lecteur. Assez lourd pour la tâche mais assez extensible.

 Ssortingng multilineJson = "{\n" + "prop1 = \"value1\",\n" + "prop2 = \"multi line\n" + "value2\"\n" + "}\n"; Ssortingng multilineJsonExpected = "{\n" + "prop1 = \"value1\",\n" + "prop2 = \"multi line\\nvalue2\"\n" + "}\n"; SsortingngWriter sw = new SsortingngWriter(); JsonProcessor jsonProcessor = new JsonProcessor(sw); jsonProcessor.write(multilineJson); assertEquals(multilineJsonExpected, sw.toSsortingng()); 

la mise en oeuvre

 public class JsonProcessor extends FilterWriter { private char[] curr; private int currIdx; private boolean doubleQuoted; public JsonProcessor(Writer out) { super(out); } @Override public void write(Ssortingng str) throws IOException { char[] arr = str.toCharArray(); write(arr, 0, arr.length); } @Override synchronized public void write(char[] cbuf, int off, int len) throws IOException { curr = Arrays.copyOfRange(cbuf, off, len - off); for (currIdx = 0; currIdx < curr.length; currIdx++) { processChar(); } } private void processChar() throws IOException { switch (currentChar()) { case '"': processDoubleQuotesSymbol(); break; case '\n': case '\r': processLineBreakSymbol(); break; default: write(currentChar()); break; } } private void processDoubleQuotesSymbol() throws IOException { doubleQuoted = !doubleQuoted; write('"'); } private void processLineBreakSymbol() throws IOException { if (doubleQuoted) { write('\\'); write('n'); if (lookAhead() == '\n' || lookAhead() == '\r') { currIdx++; } } else { write(currentChar()); } } private char currentChar() { return curr[currIdx]; } private char lookAhead() { if (currIdx >= curr.length) { return 0; } return curr[currIdx + 1]; } }