Я пишу некоторые файлы данных в формате JSON и хотел бы, чтобы некоторые действительно длинные строковые значения были разбиты на несколько строк. Используя JSON-модуль Python, я получаю массу ошибок, использую ли я \
или \n
как выход.
Возможно ли иметь многострочные строки в JSON? Это в основном для визуального комфорта, поэтому я полагаю, что я могу просто включить перенос слов в моем редакторе, но мне просто любопытно ...
Ответы:
JSON не допускает реальных разрывов строк. Вам нужно заменить все разрывы строк на
\n
.например:
"first line second line"
можно сохранить с помощью:
"first line\nsecond line"
Замечания:
ибо
Python
это должно быть записано как:"first line\\nsecond line"
где
\\
для экранирования обратной косой черты, в противном случае python будет рассматриваться\n
как управляющий символ "новая строка"источник
\n
и вывод их через Curses),\n
похоже, работает нормально. Кажется, это зависит от движка представления / рендеринга.Я должен был сделать это для небольшого проекта Node.js и нашел это обходным :
Это выглядит довольно опрятно для меня, судя по всему, я должен везде использовать двойные кавычки. Хотя в противном случае я мог бы, возможно, использовать YAML, но это имеет другие подводные камни и не поддерживается изначально. После разбора я просто использую
myData.modify_head.join('\n')
илиmyData.modify_head.join()
, в зависимости от того, хочу ли я разрыв строки после каждой строки или нет.источник
К сожалению, многие из приведенных здесь ответов касаются вопроса о том, как поместить символ новой строки в строковые данные. Вопрос в том, как сделать код лучше, разбив строковое значение на несколько строк кода. (И даже ответы, которые признают это, предоставляют «решения», предполагающие, что каждый может свободно изменять представление данных, а во многих случаях это не так.)
И что еще хуже, хорошего ответа нет.
Во многих языках программирования, даже если они явно не поддерживают разбиение строк по строкам, вы все равно можете использовать конкатенацию строк для получения желаемого эффекта; и пока компилятор не ужасен, это нормально.
Но JSON не является языком программирования; это просто представление данных. Вы не можете сказать это, чтобы объединить строки. Также его (довольно маленькая) грамматика не включает каких-либо средств для представления строки в несколько строк.
Если не считать какого-либо препроцессора (а мне, например, не хочется создавать собственный язык для решения этой проблемы), общего решения этой проблемы не существует. Если вы можете изменить формат данных, то вы можете заменить массив строк. В противном случае, это один из многочисленных способов, которыми json не предназначен для удобства чтения.
источник
Проверьте спецификацию ! Производство символов в грамматике JSON может принимать следующие значения:
"
или-\
или-контроля-символа\"
\\
\/
\b
\f
\n
\r
\t
\u
четыре шестнадцатеричные цифры номераСимволы новой строки являются «управляющими символами», поэтому нет, возможно, в вашей строке нет буквального символа новой строки. Однако вы можете закодировать его, используя любую комбинацию
\n
и\r
вам нужно.источник
JSON не позволяет разбивать строки для удобства чтения.
Лучше всего использовать IDE, которая будет для вас переносом строк.
источник
Это действительно старый вопрос, но я натолкнулся на это в процессе поиска и думаю, что знаю источник вашей проблемы.
JSON не допускает «настоящие» переводы строк в своих данных; он мог только избежать новых строк. Смотрите ответ от @YOU . В соответствии с вопросом, похоже, что вы пытались избежать разрывов строк в Python двумя способами: с помощью символа продолжения строки (
"\"
) или с помощью"\n"
в качестве escape.Но имейте в виду: если вы используете строку в Python, специальные экранированные символы (
"\t"
,"\n"
) преобразуются в РЕАЛЬНЫЕ управляющие символы!"\n"
будет заменен на управляющий символ ASCII, представляющий символ новой строки, который в точности является недопустимым в JSON. (Что касается символа продолжения строки, он просто выводит новую строку.)Так что вам нужно сделать так, чтобы Python не экранировал символы. Вы можете сделать это, используя необработанную строку (поместите
r
перед строкой, как вr"abc\ndef"
, или добавив дополнительную косую черту перед символом новой строки ("abc\\ndef"
).Оба вышеперечисленных вместо замены
"\n"
на реальный управляющий символ ASCII новой строки оставят"\n"
два литеральных символа, которые затем JSON может интерпретировать как экранирование новой строки.источник
Запишите значение свойства в виде массива строк. Как пример, приведенный здесь https://gun.io/blog/multi-line-strings-in-json/ . Это поможет.
Мы всегда можем использовать массив строк для многострочных строк, как показано ниже.
И мы можем легко перебрать массив для отображения контента в многострочном режиме.
источник
Используйте json5 (загрузчик), см. Https://json5.org/ - пример (автор json5)
источник
Возможно ли иметь многострочные строки в JSON?
Да. Я только что проверил это сейчас в своем браузере Firefox, нажав F12, щелкнув консоль и введя текст в нижней части экрана.
Объект x был только что создан из строки формата JSON, содержащей многострочную строку.
x.text отображается, показывая, что это многострочная строка.
Эти два теста показывают, что интерпретатор Javascript в Firefox с радостью создает и использует JSON с многострочными строками.
Больше тестов с
JSON.stringify
иJSON.parse
показавшим интерпретатором Javascript могут преобразовать объект , содержащий многострочные строки в JSON и разобрать его обратно без проблем вообще.В прошлом я хранил полные произведения Шекспира в виде объекта в объекте JSON, а затем отправлял их через Интернет без искажений.
пример
Вот строка из двух строк, введенная в три строки
Мы можем отобразить объект
дающий
или строка
дающий
Конец строк в строке является результатом использования \ n, а множественные входные строки достигаются с помощью только \ в конце строки.
На практике вы можете синхронизировать окончания строк с окончаниями строки, например
Длина строки в несколько строк
Обратите внимание, что строка с новой строкой не длиннее строки с пробелом. Даже если на клавиатуре были введены два символа ('\' и 'n'), в строке сохраняется только один символ.
источник
x={"a":NaN}
иx={"a":"a \<literal newline with SHIFT>b"}
, которые не являются JSON, но являются JavaScriptИспользуйте регулярные выражения, чтобы заменить все вхождения
\r\n
с\\n
.Это сработало для меня в Scala.
источник
Если вы хотите использовать Node.js, вы можете сделать это:
Вы можете импортировать с помощью Node.js и легко конвертировать его в JSON, например:
и вы получите:
как это работает : вы используете Node.js для загрузки модуля JS, который создает объект JS, который может быть легко преобразован в JSON с помощью Node.js. Параметр -e оценивает строку, а
-p
параметр выводит результат возврата последней операции Node.js в стандартный вывод.Если вы хотите загрузить скрипт .js, который находится в другом рабочем каталоге, вы должны переключить строки "" и ":
источник
Попробуйте использовать
base64
закодированное строковое значение. Работал для меня большую часть времени.после того, как
base64
закодированная строка выглядиткодирование и декодирование base64 доступно на всех языках.
источник
поместите многострочный текст в текстовый файл, а затем
(это работает на mongoDB)
источник
cat
.