Может ли значение JSON содержать многострочную строку
Я пишу файл 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"
}
}
}
Ответы
Ответ 1
Ознакомьтесь с спецификацией! Произведение грамматики JSON char может принимать следующие значения:
- любой-Unicode-символов except-
"
-или- \
-или-контроль символов
-
\"
-
\\
-
\/
-
\b
-
\f
-
\n
-
\r
-
\t
-
\u
четыре шестнадцатеричных цифры
Newlines - это "управляющие символы", поэтому нет, у вас может не быть буквальной новой строки внутри вашей строки. Однако вы можете закодировать его, используя любую комбинацию \n
и \r
, которая вам нужна.
Инструмент JSONLint подтверждает, что ваш JSON недействителен.
Обновление: И если вы хотите писать символы новой строки внутри своего синтаксиса JSON без фактического включения строк в данные, тогда вам даже вдвойне не повезло. В то время как JSON призван быть в некоторой степени дружественным к человеку, это все еще данные, и вы пытаетесь применить произвольное форматирование к этим данным. Это абсолютно не то, о чем JSON.
Ответ 2
Я не уверен в ваших точных требованиях, но одно из возможных решений для улучшения "удобочитаемости" - хранить его как массив.
{
"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(" ")
Ответ 3
Как я понял, вопрос заключается не в том, как передать строку с помощью управляющих символов с помощью json
, а как сохранить и восстановить json в файле, где вы можете разделить строку с символами управления редактором.
Если вы хотите сохранить многострочную строку в файле, тогда ваш файл не сохранит действительный объект json
. Но если вы используете только файлы json
только в своей программе, то вы можете хранить данные по своему усмотрению и удалять все новые строки из файла вручную каждый раз, когда вы загружаете его в свою программу, а затем передаете json parser.
Или, альтернативно, что было бы лучше, вы можете иметь свои исходные файлы json
, где вы редактируете sting, как хотите, а затем удалить все новые строки с помощью некоторой утилиты в действительный файл json
, который ваша программа будет использовать.
Ответ 4
Это реализовано как писатель, потому что для одиночного символа могут быть несколько выходных символов. Я не мог представить это как читателя. Довольно тяжелая задача, но довольно расширяемая.
String multilineJson = "{\n" +
"prop1 = \"value1\",\n" +
"prop2 = \"multi line\n" +
"value2\"\n" +
"}\n";
String multilineJsonExpected = "{\n" +
"prop1 = \"value1\",\n" +
"prop2 = \"multi line\\nvalue2\"\n" +
"}\n";
StringWriter sw = new StringWriter();
JsonProcessor jsonProcessor = new JsonProcessor(sw);
jsonProcessor.write(multilineJson);
assertEquals(multilineJsonExpected, sw.toString());
Реализация
public class JsonProcessor extends FilterWriter {
private char[] curr;
private int currIdx;
private boolean doubleQuoted;
public JsonProcessor(Writer out) {
super(out);
}
@Override
public void write(String str) throws IOException {
char[] arr = str.toCharArray();
write(arr, 0, arr.length);
}
@Override
synchronized public void write(char[] cbuf, int off, int len) throws IOException {
curr = Arrays.copyOfRange(cbuf, off, len - off);
for (currIdx = 0; currIdx < curr.length; currIdx++) {
processChar();
}
}
private void processChar() throws IOException {
switch (currentChar()) {
case '"':
processDoubleQuotesSymbol();
break;
case '\n':
case '\r':
processLineBreakSymbol();
break;
default:
write(currentChar());
break;
}
}
private void processDoubleQuotesSymbol() throws IOException {
doubleQuoted = !doubleQuoted;
write('"');
}
private void processLineBreakSymbol() throws IOException {
if (doubleQuoted) {
write('\\');
write('n');
if (lookAhead() == '\n' || lookAhead() == '\r') {
currIdx++;
}
} else {
write(currentChar());
}
}
private char currentChar() {
return curr[currIdx];
}
private char lookAhead() {
if (currIdx >= curr.length) {
return 0;
}
return curr[currIdx + 1];
}
}
Ответ 5
Не очень хорошее решение, но вы можете попробовать инструмент hjson. Ссылка. Это позволяет вам писать текстовые многострочные в редакторе, а затем преобразовывать их в правильный действующий формат JSON. Примечание: он добавляет символы \n 'для новых строк, но вы можете просто удалить их в любом текстовом редакторе с помощью функции "Заменить все..".
P.S. Должен быть комментарий к вопросу, но не хватает репо, извините.
Ответ 6
Я считаю, что это зависит от того, какой интерпретатор 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."
}
}
}