Я пишу некоторые файлы данных в формате JSON и хотел бы, чтобы некоторые очень длинные строковые значения были разбиты на несколько строк. Используя модуль python'JSON, я получаю кучу ошибок, независимо от того, использую ли я \
или \n
в качестве escape.
Возможно ли иметь многострочные строки в JSON? Это в основном для визуального удобства, поэтому я полагаю, что могу просто включить обводку слов в своем редакторе, но мне просто интересно...
JSON не допускает реальных переносов строк. Вам нужно заменить все переносы строк на \n
.
например:
"первая строка вторая строка"
можно сохранить с помощью:
"первая строка\nsвторая строка"
.
Примечание:
для Python
это должно быть записано как:
"первая строка\\\nsвторая строка"
.
где \\\\
- для экранирования обратной косой черты, иначе Python будет воспринимать \n
как
управляющий символ "новая строка"
Мне пришлось сделать это для небольшого проекта 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>"
],
}
Это выглядит довольно аккуратно, кроме того, что я должен использовать двойные кавычки везде. Хотя в противном случае я мог бы, возможно, использовать YAML, но у него есть другие подводные камни, и он не поддерживается нативно. После разбора я просто использую myData.modify_head.join('\n')
или myData.modify_head.join()
, в зависимости от того, нужен ли мне перевод строки после каждой строки или нет.
Проверьте спецификация! В JSON грамматика'производство char S может принимать следующие значения:
"
-или-\
-или-контроль-character\"
в\\
\/
\б
\Ф
\Н
\Р
\Т
\у
four-наговор-digitsПереводы строк на "символы" так, нет, вы не может иметь буквального перевода строки в строку. Однако вы можете кодировать его, используя любую комбинацию \N
и \Р
вы требуете.
К сожалению, многие ответы на вопрос как поставить символ в строке данных. Вопрос в том, как сделать внешний код лучше, разделив строку на несколько строк кода. (И даже ответы, которые признают это обеспечить себе "растворы", Что считать одним волен изменять представление данных, которых во многих случаях не одна.)
И чем хуже новость, нет хорошего ответа.
Во многих языках программирования, даже если они Дон'т явно поддерживают разбиение строки на строки, вы все еще можете использовать конкатенацию строк, чтобы получить желаемый эффект; и пока компилятор не'т это хорошо.
Но JSON-это не язык программирования, это's просто представление данных. Вы можете'т сказать это для конкатенации строк. Не его (достаточно небольшой) грамматика включать любой объект, представляющий строку на несколько строк.
Короткое разработки препроцессор какой-то (и я, например, Дон'т чувствую, как эффективно сделать свой собственный язык, чтобы решить эту проблему), нет'т общее решение этой проблемы. Если вы можете изменить формат данных, то можно заменить на массив строк. В противном случае, это один из многочисленных способов, которые в JSON это'т предназначены для удобства восприятия.
С JSON не'т допустить разрыва строк для удобства чтения.
Ваш лучший выбор, чтобы использовать IDE, который будет строк для вас.
Это очень старый вопрос, но я наткнулся на него в поиске и, кажется, знаю источник вашей проблемы.
JSON не допускает "настоящие" новые строки в своих данных; они могут иметь только экранированные новые строки. См. ответ от @YOU. Судя по вопросу, похоже, что вы пытались избежать перевода строки в Python двумя способами: используя символ продолжения строки ("\"
) или используя "\n"
в качестве escape.
Но имейте в виду: если вы используете строку в python, специальные экранированные символы ("\t"
, "\n"
) преобразуются в РЕАЛЬНЫЕ управляющие символы! Символ "\n"
будет заменен на управляющий символ ASCII, представляющий символ новой строки, который является именно тем символом, который запрещен в JSON. (Что касается символа продолжения строки, то он просто убирает новую строку).
Поэтому вам нужно сделать так, чтобы Python не экранировал символы. Вы можете сделать это, используя необработанную строку (поставьте r
перед строкой, как в r"abc\ndef"
, или включив дополнительный слэш перед новой строкой ("abc\\\\\ndef"
).
В обоих случаях, вместо замены "\n"
на настоящий управляющий символ новой строки ASCII, "\n"
останется как два литеральных символа, которые JSON может интерпретировать как символ перехода на новую строку.
Можно ли иметь многострочные строки в JSON?
Да. Я только что протестировал это с моей веб-браузера Firefox, нажав клавишу F12, при нажатии консоли и ввода в нижней части экрана.
x={text:"hello\nworld"}
Объект X был создан из строки в формате JSON, содержащий многострочная строка.
console.log(x.text)
hello
world
х.текст отображается, показывая, что это многострочная строка.
Эти два теста показывают, что Firefox'JavaScript-интерпретатор с удовольствием создание и использование JSON с многострочной строки.
Больше тестов с помощью JSON.преобразовать в строкии
формат JSON.разбор показал, что интерпретатор 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
Обратите внимание, что строка с новой строки не длиннее строки с пространством. Хотя два персонажа были набраны на клавиатуре ('\' и 'Н'), только один символ хранится в строке.
Записать значение свойства в виде массива строк. Как пример, приведенный здесь https://gun.io/blog/multi-line-strings-in-json/. Это поможет.
Мы всегда можем использовать массив строк для многострочных строк вроде следующего.
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
И мы можем легко перебрать массив для отображения контента в Multi линия моды.
Использовать json5 (загрузчик) см. https://json5.org/ - пример (по json5)
{
lineBreaks: "Look, Mom! \
No \\n's!",
}
Если вы готовы использовать Node.js вы можете сделать это:
module.exports = {
multilineStr: `
dis my life
it's now or never
`
}
вы можете импортировать с Node.js и преобразовать его легко в JSON вот так:
echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`
и вы получите:
{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}
как это работает: вы используете Node.js чтобы загрузить модуль на JS, который создает JS-объект, который может легко быть в JSON, содержащие по Node.js. Параметр-e оценивает строке, а опции -p
эхо возвращается результат последнего Node.js работа в stdout.
Если вы хотите загрузить .в JS скрипт, который's в другой рабочий каталог, вы обязательно включите и" " и '' строки:
my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
Попробуйте использовать в base64
закодированных строковое значение. Работал для меня большую часть времени.
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
после кодировки base64` закодированные строки похожи
{
"singleLine": "Some singleline String",
"multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
}
base64 кодирование и декодирование доступно на всех языках.