Пиша някои файлове с данни във формат JSON и бих искал някои наистина дълги стойности да бъдат разделени на няколко реда. Използвайки модула JSON на Python, получавам множество грешки, независимо дали използвам \
или \n
като escape.
Възможно ли е да има многоредови низове в JSON? Това е предимно за визуално удобство, така че предполагам, че мога просто да включа word wrap в редактора, но просто ми е малко любопитно...
JSON не позволява истински прекъсвания на редове. Трябва да замените всички прекъсвания на редове с \n
.
Например:
"първи ред втори ред"
може да се запази с:
"първи ред\нвтори ред"
Забележка:
за Python
това трябва да се запише като:
"първи ред\\\втори ред"
където \\
е за ескапиране на обратната наклонена черта, в противен случай 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 не позволява "истински" нови редове в данните си; те могат да имат само ескапирани нови редове. Вижте отговора от @YOU. Според въпроса изглежда, че сте се опитали да избегнете прекъсването на реда в Python по два начина: като сте използвали символа за продължаване на реда ("\"
) или като сте използвали "\n"
като escape.
Но имайте предвид: ако използвате низ в Python, специалните ескейп символи ("\t"
, "\n"
) се превръщат в РЕАЛНИ контролни символи! Знакът "\n"
ще бъде заменен с ASCII контролен знак, представляващ символ за нов ред, който е точно този символ, който е незаконен в JSON. (Що се отнася до символа за продължаване на реда, той просто премахва новия ред.)
Така че това, което трябва да направите, е да попречите на Python да ескапира символи. Можете да направите това, като използвате необработен низ (поставете r
пред низа, както в r"abc\ndef"
, или като включите допълнителна наклонена черта пред новия ред ("abc\ndef"
).
И двата начина, вместо да заменят "\n"
с истинския ASCII контролен символ за нов ред, ще оставят "\n"
като два буквални символа, които JSON може да интерпретира като escape за нов ред.