Чи може значення JSON містити багаторядковий рядок


114

Я пишу файл 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"
    }
  }
}


17
Я думаю, це більше стосується читабельності серіалізованого файлу JSON, а не про розривів рядків у завантажених даних (таким чином, не дублікат багаторядкових рядків у JSON ). Подумайте про це більше, як використовувати JSON як файл конфігурації, де у вас є довгий рядок, і для читабельності корисно перетягнути рядок, якщо хтось редагує його через текстовий редактор.
зашу

2
@zashu: Більшість текстових редакторів мають функцію м'якого обгортання. Це відразу корисніше, ніж деяка жорстко закодована ширина лінії.
Гонки легкості на орбіті

4
@LightnessRacesinOrbit запущений git відрізняється (або вирішує конфлікти злиття) для файлів з такими довгими рядками - також біль.
Хуберт Каріо

1
Це ДУА багаторядкового рядка в JSON, цитуючи це запитання ОП: " Чи можна мати багаторядкові рядки в JSON? Це здебільшого для візуального комфорту, тому я гадаю, що я можу просто ввімкнути обертання слів у своєму редакторі, але я "Мені просто цікаво ... "
Андре Фігейредо,

Відповіді:


61

Перевірте специфікацію ! У JSON граматики голець виробництва може набувати таких значень:

  • будь-який-Unicode-символ, за винятком- "або- \або-контроль-символ
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u чотиризначні цифри

Нові рядки - це "контрольні символи", отже, ні, можливо, у вашому рядку не буде буквального нового рядка. Однак ви можете кодувати його, використовуючи будь-яку комбінацію \nі \rвам потрібно.

Інструмент JSONLint підтверджує, що ваш JSON недійсний.


Оновлення: І якщо ви хочете записати нові рядки у синтаксис JSON, не включаючи в дані фактично нові рядки, то вам навіть удвічі не пощастить. Хоча JSON до певної міри призначений для зручності для людини, це все ще дані, і ви намагаєтесь застосувати до цих даних довільне форматування. Це абсолютно не те, про що йдеться в JSON.


32

Я не впевнений у вашій точній вимозі, але одне можливе рішення для поліпшення «читабельності» - зберігати його як масив.

{
  "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(" ")

13
Це все ж несемантично. Це витік абстракції. Я вважаю, що формат даних, визначений таким чином, по суті, порушений.
Гонки легкості по орбіті

4
Я не уявляю, як розробити документ API чи JSON таким чином, щоб збільшити читабельність рядків (лише з причин налагодження, я думаю): | ....
Адам Діга

"Я вважаю, що формат даних, визначений таким чином, по суті, порушений." Вважайте, що це для тестового випадку. Якщо ви хочете ввести рядки жорсткого коду, ви, мабуть, хочете файл властивостей. Я особисто не зберігав би "реальні" дані в JSON за звичайних обставин. Але якщо це простий спосіб перейти від тестів до тестів, то перейдіть до цього.
sf_jeff

@AdamDyga насправді це може бути корисним для зберігання файлів json у CVS, де одиниця дельти є лінією.
йота

7

Не дуже вдале рішення, але ви можете спробувати інструмент hjson . Link . Він дозволяє писати текст у багато редакцій у редакторі, а потім перетворює його у належний правильний формат JSON. Примітка. Він додає символи '\ n' для нових рядків, але їх можна просто видалити в будь-якому текстовому редакторі за допомогою функції «Замінити все ..».

PS Має бути коментарем до питання, але не вистачає репо, вибачте.


Це насправді гарна ідея. Версія контролює Hjson і перекладає його в JSON за потреби.
Гонки легкості на орбіті

3

Як я міг зрозуміти, питання полягає не в тому, як передавати рядок з керуючими символами, jsonа в тому, як зберігати і відновлювати json у файл, де можна розділити рядок за допомогою редакторів керуючих символів.

Якщо ви хочете зберегти багаторядковий рядок у файлі, то ваш файл не буде зберігати дійсний jsonоб’єкт. Але якщо ви використовуєте свої jsonфайли лише у своїй програмі, ви можете зберігати дані, як хотіли, і видаляти всі нові рядки з файлу вручну кожного разу, коли ви завантажуєте їх у свою програму, а потім переходите до json parser.

Або, що було б краще, ви можете мати свої jsonджерела даних, де ви редагуєте жало, як хочете, а потім видаліть усі нові рядки з деякою утилітою до дійсного jsonфайлу, який використовуватиме ваша програма.


2

Я вважаю, що це залежить від того, який інтерпретатор 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."
    }
  }
}

Це правильно, але проміжки з відступом будуть виводити: a\ c=> a c.
Andre Figueiredo

1
У JavaScript немає "інтерпретатора JSON", який би це прийняв. Він може приймати JSON лише в рядку. Щоправда, якщо ви надали JSON всередині рядкового літералу, тоді ви могли б скористатися таким підходом, але це незвично. Ви плутаєте JSON з фактичними об’єктами декларацій у JavaScript?
Гонки легкості по орбіті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.