Питання Чи можуть коментарі використовувати в JSON?


Чи можу я використовувати коментарі у файлі JSON? Якщо так, то як?


5797
2017-10-28 20:39


походження


@StingyJack: пояснити речі, які можуть бути не очевидними, або щось інше, що можна зробити з коментарями. Я для одного часто мають коментарі у файлах даних. XML, ini-файли та інші формати містять положення для коментарів. - Michael Burr
Якщо ви, як і я, задавалися питанням, чи //comments OK для конкретного випадку використання файлу конфігурації Sublime Text, відповідь - "так" (версії 2). Піднесений текст не буде скаржитися на це, принаймні, тоді як він буде скаржитися {"__comment": ...} в консолі, тому що це несподіване поле. - hangtwenty
і, можливо, це одна з причин створення TOML .. - Alex Nolasco
Трохи нообі, але я також намагався використовувати // для коментарів в JSON. Тепер я розумію, що це строго використовується для обміну / обміну. Зітхай! Я більше не можу коментувати: (Життя приречена !. - Sid
JSON5 підтримує коментарі: stackoverflow.com/a/7901053/108238 - schoetbi


Відповіді:


Немає.

JSON має бути всіма даними, і якщо ви додаєте коментар, то це буде також і дані.

Ви можете мати позначений елемент даних "_comment" (або щось), яке буде ігноруватися програмами, які використовують дані JSON.

Можливо, ви краще матимете коментар у процесах, які генерують / отримують JSON, оскільки вони повинні знати, які дані JSON будуть заздалегідь, або, принаймні, його структура.

Але якщо ви вирішили:

{
   "_comment": "comment text goes here...",
   "glossary": {
      "title": "example glossary",
      "GlossDiv": {
         "title": "S",
         "GlossList": {
            "GlossEntry": {
               "ID": "SGML",
               "SortAs": "SGML",
               "GlossTerm": "Standard Generalized Markup Language",
               "Acronym": "SGML",
               "Abbrev": "ISO 8879:1986",
               "GlossDef": {
                  "para": "A meta-markup language, used to create markup languages such as DocBook.",
                  "GlossSeeAlso": ["GML", "XML"]
               },
               "GlossSee": "markup"
            }
         }
      }
   }
}

4066
2017-10-28 21:01



Це може заплатити, щоб мати якийсь префікс на фактичний коментар у випадку, коли дійсне поле з назвою коментар: "__comment":"comment text goes here...", - Rob Fonseca-Ensor
Дуже недавнє пояснення / обґрунтування того, чому в JSON немає коментарів (або, точніше, чому їх видалено на ранньому етапі): plus.google.com/118095276221607585885/posts/RK8qyGVaGSr Також див. tech.groups.yahoo.com/group/json/message/156 та інші обговорення в цій темі. - Michael Burr
До речі, бібліотека json для Java google-gson має підтримку коментарів. - centic
Що робити, якщо я хочу окремого коментаря до Accronym і Abbrev властивості Я використав цей шаблон раніше, але зупинився, оскільки це не дозволяє мені це зробити. Це хак. Можливо, якщо я додам ім'я властивості з __comment__ замість цього. Тобто "__comment__Abbrev", все-таки рубати, але дозвольте мені прокоментувати всі prproerties - Juan Mendes
ви також можете використовувати "//": це виглядає більш нативним і все ще може бути повторюваним у тій самій батькові - smnbbrv


Немає, коментарі форми //… або /*…*/ не дозволено в JSON. Ця відповідь базується на:

  • http://www.json.org
  • RFC 4627: The application/json Тип носія для об'єкта JavaScript (JSON)
  • RFC 7159 Формат обміну даними об'єкта JavaScript (JSON) - вичерпні дані: 4627, 7158

1569
2017-11-15 09:32



Якщо ви хочете, щоб коментар до JSON з коментарями (таким чином, зробив це недійсним JSON), а потім зменшити його перед розбором або передачею. Сам Крокфорд визнав це в 2012 році в контексті файлів конфігурації. - toolbear
@alkuzad: Коли справа доходить до формальних граматик, має бути щось, що чітко говорить, що вони є дозволено, а не навпаки. Наприклад, прийняти вибір мови програмування: лише тому, що деяка бажана (але відсутня) функція не явно заборонена, це не означає, що ваш компілятор чарівно розпізнає його. - stakx
Так. Формат JSON має великий пробіл між елементами і в цих регіонах не залежить від простору, тому немає жодної причини, через яку ви не можете мати одномісні або багаторядкові коментарі. Багато парсерів і minifiers також підтримують коментарі JSON, тому просто переконайтеся, що ваш аналізатор підтримує їх. JSON багато використовується для даних програми та налаштувань конфігурації, тому коментарі потрібні зараз. "Офіційна специфікація" - приємна ідея, але вона недостатня, застаріла і дуже погана. Змініть свій JSON, якщо вас турбує розмір чи продуктивність корисних копій. - Triynko
Хоча ваша відповідь є абсолютно правильною, слід сказати, що це БС. З такою кількістю кінцевих користувачів, що виникають у зв'язку з необхідністю конфігурації json, коментарі надзвичайно корисні. Просто тому, що деякі шапки з олов'яною фольгою вирішили, що JSON є і повинен завжди бути Машина, що читає, ігноруючи той факт, що людина повинна її прочитати, є неперевершеним, незрозумілим. - cmroanirgo
@ cmroanirgo: Ви, очевидно, не перша, хто скаржиться на це обмеження JSON ... тому ми маємо аналізатори, які мовчки дозволяють коментувати та інші формати, такі як YAML та JSON5. Однак це не змінює той факт, що це JSON. Скоріше, я вважаю цікавим, що люди почали використовувати JSON для цілей, де це, очевидно, було недостатньо, з огляду на обмеження, про яке йде мова. Не звинувачуйте формат JSON; звинувачуйте себе в тому, щоб наполягати на використанні, де воно особливо не підходить. - stakx


Включити коментарі, якщо ви виберете; позбавити їх з міліфікатором перед аналізом або передачею.

Я щойно звільнив JSON.minify () який знімає коментарі та пробіли з блоку JSON і робить його дійсним JSON, який можна розібрати. Отже, ви можете використовувати його як:

JSON.parse(JSON.minify(my_str));

Коли я його випустив, у мене з'явилася величезна кількість людей, що не згодні навіть з думкою про це, тому я вирішив написати всебічну публікацію блогу про те, чому коментарі мають сенс в JSON. Включає цей помітний коментар від творця JSON:

Припустімо, ви використовуєте JSON для збереження файлів конфігурації, які ви хочете анотувати. Перейдіть вперед і вставте всі зауваження, які вам подобаються. Потім пропустіть його через JSMin перед передачею його в ваш синтаксичний аналізатор JSON. - Дуглас Крокфорд, 2012 рік

Сподіваємося, це корисно тим, хто не згоден з тим, чому JSON.minify () може бути корисним.


678
2018-06-23 18:20



Єдина проблема з JSON.minify () полягає в тому, що вона дійсно дуже повільна. Отже, я здійснив свою власну реалізацію, що робить те ж саме: gist.github.com/1170297 . На деяких великих тестових файлах ваша реалізація займає 74 секунди, а моя - 0,06 секунди. - WizKid
було б здорово, якщо б ви могли представити запропонований альтернативний алгоритм для github repo для JSON.minify (), так що його можна буде перенести на всі підтримувані langs: github.com/getify/json.minify - Kyle Simpson
@MiniGod Я вже багато разів почув дуги Дуга на цю тему. Я вже давно звертався до них у своєму блозі: blog.getify.com/json-comments - Kyle Simpson
@ MarnenLaibow-Koser залишаються доречні застосування для коментарів, навіть для використання потоку даних (або навіть пакета): включення діагностичних метаданих, таких як час створення або джерела, є загальним використанням у XML і ідеально чутливим для даних JSON. Аргументи проти коментарів неглибокі, і будь-який текстовий формат даних повинен дозволяти коментарі, незалежно від підозрюваного передбачуваного використання (нічого специфікації не вказує, що JSON не може використовуватися деінде, fwiw) - StaxMan
Якщо JSON має універсальний прийом (який він в основному робить), то він повинен мати універсальне застосування. Приклад: JSON може служити файлом конфігурації програми. Ця програма буде бажати коментарів. - eggmatters


Коментарі були видалені з JSON за дизайном.

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

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

Джерело: Публічна заява Дугласа Крокфорда на G +


379
2018-06-11 08:52



Я думав, що JSON повинен бути більш читаним, ніж, скажімо, XML? Коментарі для читабельності. - intrepidis
У будь-якому разі, ви можете бути непослухними і додавати синтаксичні директиви в JSON: {"__directives": {"# n #": "DateTime.Now"}, "validate": "# n #"} ... Це схоже на YAML це шлях вперед ... - intrepidis
Особиста думка: не дозволяючи коментарям ламати. У мене не було іншого вибору, окрім створення нестандартного синтаксичного аналізатора JSON, який ігнорує коментарі, для декодування моїх файлів конфігурації. - caiosm1005
@ArturCzajka Мені все ще не подобається той факт, що JSON не підтримує коментарі, але я спробував INI, і я повинен визнати, що це набагато більше сенсу використовувати їх через JSON для файлів конфігурації. Дякуємо за відгук і сподіваємося, що більше людей змінять їхні уми, читаючи цю бесіду. (робити синтаксичний аналізатор все-таки було більше вправи :) - caiosm1005
Це вимагає, щоб всі велосипеди мали тренувальні колеса, оскільки деякі люди не можуть їздити на велосипедах. Видалення важливої ​​функції, оскільки тупоумні люди зловживають, це поганий дизайн. Формат даних повинен надавати пріоритет корисності, щоб бути ідіот-доказ. - Phil Goetz


ВІДМОВА ВІД ВІДПОВІДАЛЬНОСТІ: ВАША ГАРАНТІЯ НЕ ВКАЗАНА

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

Цікава цікавість, але ти насправді не варто використовувати його взагалі. Нижче наведено оригінальну відповідь.


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

Здається, що при оголошенні літературного об'єкта можна вказати два значення з тією ж клавішею, а останній має пріоритет. Повірте це чи ні, виявляється, що аналізатори JSON працюють однаково. Таким чином, ми можемо використовувати це для створення коментарів у джерелі JSON, які не будуть присутні у представленні розбору об'єктів.

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

Якщо ми застосуємо цю техніку, коментарований файл JSON може виглядати так:

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

Наведений вище код є дійсний JSON. Якщо ви проаналізуєте це, ви отримаєте такий об'єкт:

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

Це означає, що коментарів немає, і вони не матимуть дивних побічних ефектів.

Щасливий злодій!


192
2017-08-02 13:46



Від специфікація: Імена в об'єкті повинні бути унікальними. - Quentin
"всі реалізації вчиняють це однаково" - Це важко довести. - Quentin
Порядок елементів у JSON не гарантується. Це означає, що "останній" елемент може змінитись! - sep332
Це явно порушує специфікації (див. Вище коментарі), не робіть цього. ietf.org/rfc/rfc4627.txt?number=4627 - voidlogic
НЕМАЄ - Що, якщо синтаксичний аналізатор потокує? Що робити, якщо аналізатор зчитує його в словник, де ключове замовлення не визначено? вбий це огнем. - deanWombourne


JSON не підтримує коментарі. Також ніколи не мав бути використаний для файлів конфігурації, де будуть потрібні коментарі.

Hjson - це формат файлу конфігурації для людей. Розслаблений синтаксис, менше помилок, більше коментарів.

Hjson intro

Побачити hjson.org для JavaScript, Java, Python, PHP, Rust, Go, Ruby та C # бібліотек.


123
2018-03-20 15:26



Присвоєно Це, очевидно, хороша варіація без відкритих консервативних людей просто любить ненавидіти. Я сподіваюся, що ваша реалізація стане відома далі - і, можливо, навіть стає більш популярною, ніж оригінал;) Я сподіваюсь, що кожен зможе реалізувати його і з Ruby. @adelphus Мова, яка добре визначена, - це ваша власна перспектива або думка. Будучи консервативним "розробником", якщо ви це, то не доведе, що ти краще, і ти можеш бути ще гірше, залишаючись замкнутий у обмежених місцях. Не варто легко судити людей як жахливих розробників. - konsolebox
Вибачте за це, @ konsolebox. Можливо, ви можете переглянути свою "добре визначену JSON вашу думку" після прочитання ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf Це справжній стандарт, і розробники, які реалізують власні "спеціальні" версії, призводять до фрагментації, плутанини та багато часу. Подивіться на безлад веб-розробників залишаються при написанні коду тільки тому, що кожен браузер реалізує трохи різні версії стандартів. Мова JSON може бути не ідеальним, але фрагментація ще гірша. І так, це лише думка, і ви можете вільно розходитися. - adelphus
Я захоплююсь вашою зимою, але ви напевно повторно вигадуєте ЯМЛ. Якщо ви хочете мати багато гнучкості та зручності для читання, використовуйте YAML (насправді не: stackoverflow.com/questions/450399/...) або палицю з кумудгеонією, але однозначний JSON. - toolbear
Я вважаю, що найбільш зручний для користувача формат конфігурації - все одно INI. Це просто і синтаксично важко. Це робить його менш загрозливим для користувачів, просто занурюючи свої пальці в ставок конфігурації. - Matt
Кожного разу, коли вам потрібен json як config (де є коментарі є потрібно) - назвіть свій файл ".js" замість ".json". js, звичайно, може обробляти будь-який дійсний об'єкт json і додатково може обробляти коментарі .. Ось чому це "webpack.config.js", а не "webpack.config.json" (ну є ще багато причин для цього в webpack: P) - jebbie


Ви не можете. По крайней мере, це мій досвід з швидкого погляду на json.org.

JSON має синтаксис, який видається на цій сторінці. Немає жодної примітки про коментарі.


95
2017-10-28 20:42