Подтвердить что ты не робот

Может ли значение 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"
    }
  }
}
4b9b3361

Ответ 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."
    }
  }
}