Многострочные строки в JSON

Я пишу некоторые файлы данных в формате JSON и хотел бы иметь некоторые действительно длинные строковые значения, разделенные на несколько строк. Используя модуль JSON python, я получаю много ошибок, использую ли я \ или \n как escape.

Возможно ли иметь многострочные строки в JSON? Это в основном для визуального комфорта, поэтому я полагаю, что могу просто перевернуть перенос слов в своем редакторе, но мне просто любопытно...

Ответ 1

JSON не допускает реальных разрывов строк. Вам нужно заменить все разрывы строк на \n.

например:

"first line second line"

можно сохранить с помощью:

"first line\nsecond line"

Замечания:

для Python это должно быть записано как:

"first line\\nsecond line"

где \\ для экранирования обратной косой черты, иначе python будет рассматривать \n как управляющий символ "новая строка"

Ответ 2

Мне пришлось сделать это для небольшого проекта Node.js и нашел это обход:

{
 "modify_head": [

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

 ],

 "modify_body": [

  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"

 ],
}

Это выглядит довольно аккуратно для меня, appart из того, что я должен использовать двойные кавычки повсюду. Хотя в противном случае я мог бы, возможно, использовать YAML, но у этого есть другие подводные камни и не поддерживается изначально. После разбора я просто использую myData.modify_head.join('\n') или myData.modify_head.join(), в зависимости от того, хочу ли я прерывать строку после каждой строки или нет.

Ответ 3

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

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

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

Ответ 4

JSON не позволяет разбивать строки на удобочитаемость.

Лучше всего использовать IDE, которая будет обертываться для вас.

Ответ 5

Это действительно старый вопрос, но я натолкнулся на это в процессе поиска и думаю, что знаю источник вашей проблемы.

JSON не допускает "настоящие" переводы строк в своих данных; он мог только избежать новых строк. Смотрите ответ от @YOU. В соответствии с вопросом, похоже, что вы пытались избежать разрывов строк в Python двумя способами: с помощью символа продолжения строки ("\") или с помощью "\n" в качестве escape.

Но имейте в виду: если вы используете строку в Python, специальные экранированные символы ("\t", "\n") переводятся в РЕАЛЬНЫЕ управляющие символы! "\n" будет заменен управляющим символом ASCII, представляющим символ новой строки, который является именно тем символом, который недопустим в JSON. (Что касается символа продолжения строки, он просто выводит новую строку.)

Так что вам нужно сделать так, чтобы Python не экранировал символы. Вы можете сделать это, используя необработанную строку (поместите r перед строкой, как в r"abc\ndef", или r"abc\ndef" дополнительную косую черту перед новой "abc\\ndef" ("abc\\ndef").

В обоих случаях вместо замены "\n" на реальный управляющий символ ASCII новой строки будет оставлено "\n" как два литеральных символа, которые затем JSON может интерпретировать как экранирование новой строки.

Ответ 6

К сожалению, многие из ответов здесь касаются вопроса о том, как поместить символ строки в строковые данные. Вопрос в том, как сделать код более приятным, разделив строковое значение на несколько строк кода. (И даже ответы, которые признают это, обеспечивают "решения", которые предполагают, что они могут изменять представление данных, что во многих случаях это не так.)

И хуже всего то, что нет хорошего ответа.

Во многих языках программирования, даже если они явно не поддерживают разделение строк по строкам, вы все равно можете использовать конкатенацию строк для получения желаемого эффекта; и пока компилятор не ужасен, это прекрасно.

Но json не является языком программирования; это просто представление данных. Вы не можете сказать это, чтобы объединить строки. Кроме того, в его (довольно малой) грамматике нет никакого средства для представления строки на нескольких строках.

За исключением разработки какого-либо препроцессора (и я, например, не хочу, чтобы эффективно составлять собственный язык для решения этой проблемы), нет общего решения этой проблемы. ЕСЛИ вы можете изменить формат данных, тогда вы можете заменить массив строк. В противном случае это один из многочисленных способов, с помощью которых json не предназначен для удобочитаемости.

Ответ 7

Возможно ли иметь многострочные строки в JSON?

Да. Я просто протестировал это сейчас со своим веб-браузером Firefox, нажав F12, нажав консоль и набрав в нижней части экрана.

x={text:"hello\nworld"}

Объект x только что был создан из строки формата JSON, содержащей многострочную строку.

console.log(x.text)
hello
world
Отображается

x.text, показывающий, что это многострочная строка.

Эти два теста показывают, что интерпретатор Firefox Javascript с радостью создает и использует JSON с многострочными строками.

Дополнительные тесты с JSON.stringify и JSON.parse показали, что интерпретатор Javascript может преобразовать объект, содержащий многострочные строки в JSON, и проанализировать его снова без каких-либо проблем.

В прошлом я хранил полные работы Шекспира как свойство в объекте JSON, а затем отправлял его через Интернет, без искажений.

Пример

Вот две строки, введенные в три строки

x={text:"expert\
s\nex\
change"}

Мы можем отобразить объект

console.log(x)

дает

Object { text: "experts\nexchange" }

или строка

console.log(x.text)

дает

experts
exchange

Конец строк в строке получается из использования \n и несколько входных линий достигаются с помощью только\в конце строки.

На практике вам может понадобиться синхронизировать концы строк с строками в строке, например

x={text:"experts\n\
exchange"}

Длина многострочной строки

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11

Обратите внимание, что строка с новой строкой не длиннее строки с пробелом. Несмотря на то, что на клавиатуре были введены два символа ('\' и 'n'), в строке сохраняется только один символ.

Ответ 8

Записать значение свойства в виде массива строк. Пример, приведенный здесь https://gun.io/blog/multi-line-strings-in-json/. Это поможет.

Мы всегда можем использовать массив строк для многострочных строк, например:

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

И мы можем легко перебирать массив для отображения контента в многострочном режиме.

Ответ 9

Используйте regex для замены всех вхождений \r\n на \\n.

Это работало для меня в scala.

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

Ответ 10

Используйте json5 (загрузчик), см. Https://json5.org/ - пример (автор json5)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}

Ответ 11

Если вы хотите использовать Node.js, вы можете сделать это:

module.exports = {

  multilineStr: '

     dis my life 
     it now or never

  '

}

Вы можете импортировать с помощью Node.js и легко конвертировать его в JSON, например:

echo 'node -pe 'JSON.stringify(require("./json-mod.js"))''

и вы получите:

{"multilineStr":"\n \n dis my life\n it now or never\n \n "}

как это работает: вы используете Node.js для загрузки модуля JS, который создает объект JS, который может быть легко преобразован в JSON с помощью Node.js. Опция -e оценивает строку, а опция -p результат возврата последней операции Node.js в стандартный вывод.

Если вы хотите загрузить скрипт .js, который находится в другом рабочем каталоге, вы должны переключить строки "" и ":

my_script='../json-mod.js'
echo 'node -pe "JSON.stringify(require('$my_script'))"'

Ответ 12

Машины не заботятся, люди могут изменить параметры просмотра. Я действительно не мог понять проблему Notepad: Format > Word Wrap Visual Code: View > Toggle Word Wrap

Ответ 13

для мультилинии я использую:

singleline: 'value',
singleline: "value",
multiline: '''
  line 1
  line 2
'''

Ответ 14

Оберните каждую строку в кавычки и завершите их запятой, как показано ниже:

"content": [
    "This is the first line",
    "this is second",
    "and so on"
]

Ответ 15

{{имя}} {{
имя1}}

my.opt.push({'name': 'line1', 'name1': 'line2')

Ответ 16

вы можете просто запустить код ниже с вашим желанием многострочной строки между тильдой ~ персонажем:

var multiLineString = '
this
    is
        the
            multiline
                    String

';
JSON.stringify(multiLineString);

Ответ 17

Попробуйте использовать строковое значение base64. Работал для меня большую часть времени.

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

после кодировки строки base64

{
    "singleLine": "Some singleline String",
    "multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
} 

base64 кодирование и декодирование доступно на всех языках.

Ответ 18

Просто добавьте теги абзацев, чтобы они выглядели аккуратно и эффективнее.

Пример: "тело":

Пункт 1 здесь.

Пункт 2 здесь.

",

Ответ 19

fieldval = rs.getString(rs.getMetaData().getColumnName(i))
  .trim()
  .replace("\\", "/")
  .replace("\r\n", "\\n")
  .replace("''", "\\n")
  .replace("\"", "\\n");

Ответ 20

написать любой текст в блокноте ++ с помощью multi multi line затем нажмите ctl + a и ctl + j, чтобы расположить их в одной строке

В файле json напишите:

{
"key":"multi line copied from notepad++"
}

Ответ 21

поместите многострочный текст в txt файл, а затем

var str = {
    text: cat('path_to_file/text.txt')
}

(он работает на mongoDB)

Ответ 22

Вы можете попробовать разместить <div></div> между предложениями.