Может ли значение JSON содержать многострочную строку

114

Я пишу файл JSON, который будет читать программа Java. Фрагмент такой ...

{
  "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
источник
4
возможное дублирование многострочных строк в JSON
Lightness Races in Orbit
17
Я думаю, что это больше касается читабельности сериализованного файла JSON, а не разрывов строк в загруженных данных (таким образом, не дубликата многострочных строк в JSON ). Думайте об этом как об использовании JSON как файла конфигурации, где у вас есть длинная строка, и для удобства чтения полезно жестко обернуть строку на случай, если кто-то редактирует ее через текстовый редактор.
zashu
2
@zashu: В большинстве текстовых редакторов есть функция мягкого переноса. Это сразу более полезно, чем жестко заданная ширина линии.
Гонки легкости на орбите
4
@LightnessRacesinOrbit, запускающий git diffs (или разрешение конфликтов слияния) для файлов с такими длинными строками, также является проблемой.
Hubert Kario
1
Это обман многострочной строки в JSON, цитируя вопрос OP: « Можно ли иметь многострочные строки в JSON? Это в основном для визуального комфорта, поэтому я полагаю, что могу просто включить перенос слов в моем редакторе, но я просто любопытно ... »
Андре Фигейредо

Ответы:

61

Ознакомьтесь со спецификацией ! Создание char в грамматике JSON может принимать следующие значения:

  • любой-Unicode-символы except- "-или- \-или-контроль символы
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u четыре шестнадцатеричных цифры

Новые строки - это «управляющие символы», поэтому нет, в вашей строке может не быть буквального перевода строки. Однако вы можете кодировать его , используя любые комбинации \nи \rвам требуется.

Инструмент JSONLint подтверждает, что ваш JSON недействителен.


Обновление: И если вы хотите писать символы новой строки внутри синтаксиса JSON без фактического включения новой строки в данные, то вам даже вдвойне не повезло. Хотя JSON в определенной степени предназначен для удобства пользователей, это все еще данные, и вы пытаетесь применить к этим данным произвольное форматирование. JSON - это совершенно не то.

Гонки легкости на орбите
источник
32

Я не уверен в ваших точных требованиях, но одно из возможных решений для улучшения «читабельности» - сохранить его в виде массива.

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

}

Присоединение снова при необходимости с

result.join(" ")
Брайан МакОлифф
источник
13
Хотя это бессмысленно. Это утечка абстракции. Я считаю, что формат данных, указанный таким образом, по сути, нарушен.
Lightness Races in Orbit
4
Я не могу представить себе разработку API или документа JSON таким образом только для повышения читабельности строк (полагаю, только для отладки): | ....
Адам Дыга
«Я считаю, что формат данных, указанный таким образом, по сути, нарушен». Однако учтите, что это для тестового примера. Если вы хотите жестко запрограммировать строки, вам, вероятно, понадобится файл свойств. Лично я бы не стал хранить «настоящие» данные в JSON при нормальных обстоятельствах. Но если это простой способ перейти от отсутствия тестов к тестам, сделайте это.
sf_jeff
@AdamDyga на самом деле может быть полезно для хранения файлов json в CVS, где единицей дельты является строка.
Йота
7

Не очень хорошее решение, но вы можете попробовать инструмент hjson . Ссылка . Это позволяет вам писать многострочный текст в редакторе, а затем преобразовывать его в правильный допустимый формат JSON. Примечание: он добавляет символы '\ n' для новых строк, но вы можете просто удалить их в любом текстовом редакторе с помощью функции «Заменить все ..».

PS Должен быть комментарий к вопросу, но не хватает репо, извините.

CodeMonkey
источник
На самом деле это хорошая идея. Управляйте версиями Hjson и при необходимости переносите их в JSON.
Гонки
3

Насколько я понял, вопрос не в том, как передать строку с использованием управляющих символов, jsonа в том, как сохранить и восстановить json в файле, где вы можете разделить строку с помощью управляющих символов редактора.

Если вы хотите сохранить многострочную строку в файле, ваш файл не будет хранить допустимый jsonобъект. Но если вы используете свои jsonфайлы только в своей программе, вы можете хранить данные по своему усмотрению и удалять все новые строки из файла вручную каждый раз, когда вы загружаете его в свою программу, а затем переходите к парсеру json.

Или, в качестве альтернативы, что было бы лучше, вы можете иметь свои jsonфайлы источников данных, в которых вы редактируете sting по своему усмотрению, а затем удаляете все новые строки с помощью какой-либо утилиты из допустимого jsonфайла, который будет использовать ваша программа.

JustAnotherCurious
источник
2

Я считаю, что это зависит от того, какой интерпретатор json вы используете ... в простом javascript вы можете использовать терминаторы строки

{
  "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."
    }
  }
}
Элрик Бест
источник
Это правильно, но пробелы с отступом будут выводить: a\ c=> a c.
Андре Фигейредо
1
В JavaScript нет «интерпретатора JSON», который мог бы это принять. Он может принимать только JSON в строке. Верно, если вы предоставили JSON внутри строкового литерала, вы могли бы воспользоваться этим подходом, но это необычная вещь. Вы путаете JSON с фактическими объявлениями объектов в JavaScript?
Гонки