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


7604

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


153
@StingyJack: Щоб пояснити речі, які можуть бути не очевидні, або що б там не було ще з коментарями. У мене часто є коментарі у файлах даних. XML, ini-файли та багато інших форматів містять положення для коментарів.
Майкл Берр

24
Якщо ви, як і я, цікавились, чи //commentsдобре для конкретного випадку використання файлу конфігурації Sublime Text, відповідь - так (у версії 2). Піднесений текст не буде скаржитися на нього, принаймні, тоді як він буде скаржитися {"__comment": ...}на консолі, тому що це поле несподіване.
driftcatcher

8
і, можливо, це одна з причин, чому TOML був створений ..
Алекс Ноласко

10
Злегка noobish, але я також спробував використовувати // для коментарів у JSON. Тепер я усвідомлюю, що його суворо використовують для обміну / обміну. Зітхніть! Я не можу коментувати більше :( Життя приречена! ..
Sid

12
JSON5 підтримує коментарі: stackoverflow.com/a/7901053/108238
schoetbi

Відповіді:


5589

Ні.

Усі 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"
            }
         }
      }
   }
}

232
Можливо, заплатити, щоб мати якийсь префікс на фактичний коментар у випадку, якщо коли-небудь буде дійсне поле з ім'ям коментаря:"__comment":"comment text goes here...",
Rob Fonseca-Ensor

19
BTW, бібліотека json для Java google-gson підтримує коментарі.
центральний

11
Що робити, якщо я хотів окремий коментар щодо властивостей Accronymі Abbrevвластивостей? Я раніше користувався цією схемою, але зупинився, оскільки вона не дозволяє мені це робити. Це злом. Можливо, якщо я __comment__замість цього додам ім'я властивості . Це "__comment__Abbrev", все ще хак, але дозвольте мені прокоментувати всі prpoerties
Juan Mendes

41
ви також можете використовувати "//": це виглядає більш рідним і все ще повторюється в тому самому батьків
smnbbrv

4
Коли JSON використовується для призначених для людини файлів конфігурації, їх слід помітити, щоб люди краще розуміли. Повідомлено, такий файл більше не є дійсним JSON, але є рішення. Наприклад, GYP від ​​Google підтримує коментарі # -style. JSON.Minify допоможе вам відкинути коментарі у стилі C / C ++ зі вхідного файлу.
Петър Петров

1841

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

  • http://www.json.org
  • RFC 4627 : application/jsonТип медіа для нотації об'єкта JavaScript (JSON)
  • RFC 8259 Формат обміну даними з нотацією об'єкта JavaScript (JSON) (перевершує RFC 4627, 7158, 7159)

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

24
@alkuzad: Коли справа доходить до формальних граматик, там повинно бути що - то , що явно говорить , що вони будуть дозволені, а не навпаки. Наприклад, візьміть на вибір мову програмування: лише тому, що якась бажана (але відсутня) функція явно заборонена, це не означає, що ваш компілятор магічно розпізнає її.
stakx - більше не вносить внесок

5
Так. Формат JSON має багато пробілу між елементами і нечутливий до простору в цих регіонах, тому немає жодної причини, чому ви не можете мати одно- або багаторядкових коментарів там. Багато парсери та мініфішери підтримують також коментарі JSON, тому просто переконайтеся, що ваш парсер їх підтримує. JSON дуже часто використовується для даних програми та налаштувань конфігурації, тому коментарі зараз потрібні. "Офіційна специфіка" - це приємна ідея, але вона недостатня і застаріла, тому занадто погана. Мінімізуйте свій JSON, якщо вас турбує розмір корисної навантаження або продуктивність.
Трайнко

58
Хоча ваша відповідь абсолютно правильна, слід сказати, що це BS. Оскільки так багато кінцевих користувачів стикаються з необхідністю конфігурації json, то коментарі дуже корисні. Тільки тому, що деякі капелюшки з олов'яної фольги вирішили, що JSON є і завжди повинен бути машиночитаним, ігноруючи той факт, що людям потрібно це читати, - це марення малого розуму.
cmroanirgo

18
@cmroanirgo: Ви, очевидно, не перший, хто скаржиться на таке обмеження JSON ... саме тому у нас є аналізатори, які мовчки дозволяють коментарі, та інші формати, такі як YAML та JSON5. Однак це не змінює того факту, що JSON є таким, яким він є. Швидше, мені здається цікавим, що люди почали використовувати JSON для цілей, де, очевидно, в першу чергу це було недостатньо, враховуючи таке обмеження. Не звинувачуйте формат JSON; звинувачуємо себе в наполяганні на тому, щоб використовувати його там, де це не дуже добре.
stakx - більше не вносить допису

802

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

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

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

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

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

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


153
Єдина проблема, яку я маю з JSON.minify (), - це те, що вона дійсно дуже повільна. Тому я зробив власну реалізацію, яка робить те саме: gist.github.com/1170297 . На деяких великих тестових файлах ваша реалізація займає 74 секунди, а моя 0,06 секунди.
WizKid

56
було б чудово, якби ви могли надіслати запропонований альтернативний алгоритм до github repo для JSON.minify (), щоб він міг перенестись до всіх підтримуваних мов: github.com/getify/json.minify
Kyle Simpson

16
@MiniGod Я вже багато разів чув думки Дуга на цю тему. Я звертався до них давно у своєму дописі в блозі: blog.getify.com/json-comments
Кайл Сімпсон,

18
@ MarnenLaibow-Koser все ще є дійсним використання коментарів навіть для використання потоку даних (або навіть пакетів): включення діагностичних метаданих, таких як час створення або джерела, є загальним використанням для XML, а також чудово розумним для даних JSON. Аргументи проти коментарів неглибокі, і будь-який текстовий формат даних повинен містити коментарі, незалежно від передбачуваного наміченого використання (жодна специфікація не дозволяє припустити, що JSON не можна використовувати в іншому місці, fwiw)
StaxMan

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

441

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

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

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

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


198
Я думав, що JSON повинен був бути більш читабельним для людини, ніж, скажімо, XML? Коментарі - для читабельності.
intrepidis

25
У будь-якому випадку, ви можете бути неслухняними і додати директиви розбору в JSON: {"__directives": {"# n #": "DateTime.Now"}, "validdate": "# n #"} ... Це схоже на YAML це шлях вперед тоді ...
intrepidis

73
Особиста думка: не допускати коментарів IS кульгавий. У мене не було іншого варіанту, крім створення нестандартного аналізатора JSON, який ігнорує коментарі, для декодування моїх конфігураційних файлів.
caiosm1005

17
@ArturCzajka Мені все ще не подобається факт, що JSON не підтримує коментарів, але я спробував INI, і я повинен визнати, що це набагато більше сенсу використовувати їх через JSON для конфігураційних файлів. Дякуємо за відгук, і, сподіваємось, більше людей передумають, читаючи цю розмову. (робити парсер все-таки більше вправою :)
caiosm1005

77
Це як вимагати, щоб усі велосипеди мали навчальні колеса, оскільки деякі люди не можуть їздити на велосипедах. Видалення важливої ​​функції, тому що дурні люди зловживають, це поганий дизайн. Формат даних повинен надавати перевагу зручності використання, ніж захист від ідіотів.
Філ Гец

205

ВІДХОДЖЕННЯ: ВАША ГАРАНТІЯ ВІДМОВА

Як уже зазначалося, цей хак використовує переваги впровадження специфікації. Не всі аналізатори 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]
}

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

Щасливий злом!


150
З специфікації : Імена в межах об’єкта ДОЛЖНІ бути унікальними.
Квентін

113
"всі реалізації обробляють це однаково" - Це важко довести.
Квентін

91
Порядок елементів у JSON не гарантується. Це означає, що "останній" пункт може змінитися!
sep332

66
Це явно порушує специфікацію (див. Вище коментарі), не робіть цього. ietf.org/rfc/rfc4627.txt?number=4627
voidlogic

333
НІ - що робити, якщо аналізатор потокового потоку? Що робити, якщо аналізатор читає його у словнику, де впорядкування ключів не визначене? вбити це вогнем .
deanWombourne

183

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

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

Hjson intro

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


13
Отримано. Це, очевидно, хороша варіація, коли не відкриті консерватори просто люблять ненавидіти. Я сподіваюся, що ваша реалізація стане відома далі - і, можливо, навіть стає більш популярною, ніж оригінал;) Я сподіваюся, що хтось отримає можливість реалізувати це і з Ruby. @adelphus Ясно визначена мова - це ваша власна точка зору чи думка. Бути консервативним "розробником", якщо ви такий, не доводить, що ви кращі, і ви можете бути ще гірше, тримаючи себе в замкнутому просторі. Не варто легко оцінювати людей як жахливих розробників.
konsolebox

7
Вибачте з цього приводу, @konsolebox. Можливо, ви можете переглянути свій «чітко визначений JSON - ваша думка», прочитавши ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf Це справжній стандарт і розробники, що реалізують власні «спеціальні» версії призводить до роздробленості, плутанини і багато витраченого часу. Подивіться, що веб-розробники безладно залишаються при написанні коду лише тому, що кожен браузер реалізує трохи різні версії стандартів. Мова JSON може бути не ідеальною, але фрагментація гірша. І так, це лише думка, і ви вільні не погоджуватися.
adelphus

22
Я захоплююсь вашою демплією, але ви якось переробили YAML. Якщо ви хочете багатої гнучкості та людської читабельності, використовуйте YAML (насправді: stackoverflow.com/questions/450399/… ) або дотримуйтесь стриманості, але однозначно JSON.
інструментберез

4
Я вважаю, що найбільш зручним для користувача форматом конфігурації є INI. Це простий і не дуже ситний синтаксис. Це робить його менш залякуючим для користувачів, просто опускаючи пальці ніг у конфігураційному ставку.
Метт

14
Всякий раз , коли вам потрібно , як JSON конфігурації (де коментарі є необхідно) - ім'я файлу «.js» замість «.json» .. JS може звичайно обробляти будь дійсний об'єкт JSON і додатково може обробляти коментарі .. Ось причина , чому "webpack.config.js", а не "webpack.config.json" (ну, є ще багато причин тому в webpack: P)
jebbie

122

Подумайте про використання YAML. Це майже суперсет JSON (практично всі дійсні JSON є дійсними YAML), і це дозволяє коментувати.


12
@ g33kz0r Правильно, звідси мій опис YAML як майже суперсета JSON.
Marnen Laibow-Koser

12
@NateS Багато людей вже вказували, що відповідь - ні. Я запропонував кращий спосіб досягти мети ОП. Це відповідь.
Marnen Laibow-Koser

5
Знизу: yamlбібліотека не постачається з Python.
Кровотечі пальцями

6
@ marnen-laibow-koser: так, це, мабуть, було некомпетентним для використання наявних бібліотек YAML для Java та Perl, і очікувати, що вироблена кожною YAML споживається іншим без помилок. Те, що інтероп YAML був проблемою, але інтероп JSON не був, цілком пояснюється моєю відсутністю знань.
інструментберез

3
@ marnen-laibow-koser, краще формат, який виконує те саме, що простішим специфікацією. Прагматичний формат із ідеальними реалізаціями краще, ніж ідеальний формат із недосконалими реалізаціями. Не вся провина за несправні лайки лежить на плечах виконавців; Специфікація YAML довга, густа і тупа. Запис у Вікіпедії наводить два приклади двозначності; якщо потрібно поставити випромінювач між людиною та форматом, щоб захистити їх від неоднозначностей, то формат втрачає дружню людину претензію. JSON стверджує, що менше, і в основному досягає успіху там, де YAML заявляє більше і не вистачає.
toolbear

108

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

На цій сторінці синтаксис JSON візуалізується. Зауважень щодо коментарів немає.


67

Коментарі не є офіційним стандартом, хоча деякі парсери підтримують коментарі у стилі C ++. Я використовую JsonCpp . У прикладах є такий:

// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}

jsonlint не підтверджує це. Таким чином, коментарі - це розширення для специфічного розбору і не стандартне.

Ще один аналізатор - JSON5 .

Альтернатива JSON TOML .

Наступною альтернативою є jsonc .


У Groovy є кілька вбудованих класів поводження з JSON . JsonSlurper може обробляти коментарі. Звичайно, коментарі не допускаються в офіційній специфікації, тому така поведінка в будь-якому аналізаторі є нестандартною та непереносною.
izrik

Newtonsoft Json.NET також без проблем підтримує коментарі у стилі C
Макс

66

Натомість слід написати схему JSON . Наразі схема JSON є запропонованою специфікацією проекту Internet. Крім документації, схему можна також використовувати для перевірки ваших даних JSON.

Приклад:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

Ви можете надати документацію за допомогою атрибута схеми опису .


5
Чи жива схема JSON? Вона існує, але чи підтримується вона будь-якою відомою бібліотекою?
Мунхіцу

1
так, google група json-schema є досить активною, і я рекомендую JSV для гарної реалізації JavaScript валідатора схеми JSON.
raffel

5
Це допомагає лише структурованій документації, а не спеціальній документації
Хуан Мендес

Якщо ви використовуєте clojure (і я впевнений, що ви цього не зробите), тут є досить сильно
проаналізований

@Munhitsu Manatee.Json (.Net) широко підтримує схему JSON.
gregsdennis

64

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

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

Тоді ви можете мати такі коментарі:

{
  key: "value" // Comment
}

Також ви можете мати коментарі, починаючи з #налаштування:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Але загалом (як відповіли раніше) специфікація не дозволяє коментарі.


50

Ось що я знайшов у документації Google Firebase, яка дозволяє розміщувати коментарі в JSON:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project's sender ID",
  "gcm_sender_id": "1234567890"
}

FYI, база даних реального часу Firebase не дозволяє використовувати клавішу '/'. тож це може бути приємною
умовою

5
Цей метод порушує деякі бібліотеки, для яких ключ повинен бути унікальним. Я працюю над цим питанням, нумеруючи коментарі.
MovGP0

хороший коментар, я знайшов це питання на ТАК ... ця частина, здається, не охоплена специфікацією stackoverflow.com/questions/21832701/…
мана

4
Я схильний використовувати його так сьогодні: {"// foo": "коментар foo", "foo": "foo value", "// bar": "bar comment", "bar": "bar value"} Ви можете використовувати масив для кількох коментарів: {"// foo": ["foo comment 1", "foo comment 2"], "foo": '' foo value "}
MovGP0

47

НІ . JSON використовував для підтримки коментарів, але їх зловживали та видаляли зі стандарту.

Від творця JSON:

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

Офіційний сайт JSON знаходиться на JSON.org . JSON визначається стандартом ECMA International. Завжди існує процес подання петицій, щоб переглядати стандарти. Навряд чи анотації будуть додані до стандарту JSON з кількох причин.

JSON за задумом - це легко реверсивна (людський аналіз) альтернатива XML. Це спрощується навіть до того, що анотації не потрібні. Це навіть не мова розмітки. Мета - стабільність та взаємодія.

Кожен, хто розуміє співвідношення об'єкта "має", може зрозуміти будь-яку структуру JSON - у цьому вся суть. Це просто спрямований ациклічний графік (DAG) з тегами вузлів (пари ключів / значень), який є майже універсальною структурою даних.

Ця необхідна примітка може бути "// Це теги DAG". Назви ключів можуть бути настільки інформативними, наскільки це потрібно, дозволяючи довільну смислову суворість.

Будь-яка платформа може проаналізувати JSON лише за допомогою декількох рядків коду. XML вимагає складних OO-бібліотек, нежиттєздатних на багатьох платформах.

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

Але, як зауважив творець JSON, завжди існувала підтримка JS-конвеєра для коментарів:

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


37

Якщо ваш текстовий файл, що представляє собою рядок JSON, читатиме якась програма, наскільки складно буде викреслити коментарі у стилі C або C ++ перед його використанням?

Відповідь: Це був би один лайнер. Якщо ви це зробите, тоді файли JSON можуть використовуватися як файли конфігурації.


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

Я погоджуюся і написав JSON-аналізатор на Java, доступний на веб-сайті www.SoftwareMonkey.org, який робить саме це.
Лоуренс Дол

2
Незважаючи на те, що я думаю, розширювати JSON (не називаючи його іншим форматом обміну) не годиться: не забудьте проігнорувати "коментарі" в рядках. {"foo": "/ * Це не коментар. * /"}
stofl

27
"... був би один вкладиш" гмм, ні, насправді, JSON не є звичайною граматикою, де регулярний вираз може просто знайти відповідні пари / *. Ви повинні проаналізувати файл, щоб виявити, чи з'являється / * всередині рядка (і проігнорувати його), чи він уникнути (і проігнорувати) тощо. будь-яке рішення.
Кайл Сімпсон

1
Що сказав @ kyle-simpson. Крім того, він занадто скромний, щоб скеровувати читачів до власної відповіді про використання JSON.minify як альтернативу спеціальним регулярним виведенням. Робіть це, не це.
toolbear

36

Якщо ви використовуєте бібліотеку Newtonsoft.Json з ASP.NET для читання / десяріалізації, ви можете використовувати коментарі у вмісті JSON:

// "name": "string"

// "id": int

або

/* Це

приклад коментаря * /

PS: Однорядкові коментарі підтримуються лише в 6+ версіях Newtonsoft Json.

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

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

Я думаю, що це "простіший у використанні / розумінні" спосіб, ніж створення окремого файлу "settings.README" та пояснення параметрів у ньому.

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


Важко зрозуміти, чому у когось виникнуть проблеми з констатацією факту.
dvdmn

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

5
Я повністю погоджуюся з вами, і все ж наразі є 883 оновлень за невідповідь, яка лише стверджує очевидне. Ідеологічна чистота, що оцінюється вище корисної інформації, це ОД для вас.
Джон

Справа в тому, що файл з коментарями не є JSON і не зможе проаналізувати багато бібліотек JSON. Не соромтеся робити все, що завгодно у власній програмі, але файл із коментарями - це не JSON. Якщо ви стверджуєте, що це, то люди намагатимуться їх розібрати зі своєю мовою / бібліотекою на вибір, і це не вдасться. Це як запитати, чи можна використовувати квадратні дужки замість кутових дужок у XML. Ви можете робити все, що завгодно, але це вже не буде XML.
gman

32

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

Це насправді не дозволяє коментарі як такі, однак передача коментаря як однієї з імен / значень пар у даних, безумовно, спрацює, хоча ці дані, очевидно, повинні бути проігноровані або оброблені спеціально кодом розбору.

Все, що було сказано, це не намір, щоб файл JSON містив коментарі в традиційному розумінні. Це повинні бути просто дані.

Перегляньте веб-сайт JSON для отримання більш детальної інформації.


17
Це правда, що формат JSON не має коментарів. Особисто я вважаю, що це істотна помилка - можливість використовувати коментарі як метадані (а не дані) - дуже корисна річ із xml. Раніші версії специфікації JSON містили коментарі, але чомусь вони були відхилені. : - /
StaxMan

4
@StaxMan їх скинули саме тому, що люди почали використовувати їх як метадані. Крокфорд заявив, що це порушило сумісність того, що був розроблений формат, і я згоден: якщо ви хочете метадані, чому б не включити їх як фактичні дані? Ще простіше розібратися таким чином.
Каміло Мартін

6
Метадані належать до конструкцій метаданих (наприклад, HTML <meta> теги), а не коментарів. Зловживання коментарями для метаданих - це просто хак, який використовується там, де немає справжньої конструкції метаданих.
Marnen Laibow-Koser

Саме ця причина була відхилена: коментарі, використовувані як метадані, порушили б сумісність. Ви також просто повинні зберігати свої метадані як JSON.
габоровий

1
Ця відповідь є зайвою кращими написаними, більш вигідними відповідями, які говорять по суті про одне і те ж, хоча це, можливо, було написано і раніше. Це життя.
toolbear

29

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

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

Я думаю, що можна було б використовувати "#": "comment"для "дійсного" JSON.


4
Для конфігураційних файлів я б запропонував YAML, а не JSON. Це (майже) більш потужний набір JSON, але підтримує і більш читані конструкції, включаючи коментарі.
Marnen Laibow-Koser

1
на скільки мов, на вашу думку, підтримується YAML поза коробкою порівняно з json?
ммм

@Hamidam Більше десятка мов підтримують yaml: yaml.org - але ви маєте право запитати, скільки людей має вбудовану підтримку, не потребуючи сторонніх бібліотечних залежностей. Схоже, це робить Ruby 1.9.2. Хтось знає про інших? І якими мовами підтримується підтримка json за замовчуванням?
nealmcb

5
YAML Interop брехня: stackoverflow.com/questions/450399 / ... . Якщо ваш інстинкт використовувати JSON для файлів конфігурації, дотримуйтесь цього.
інструментберез

Це старе, але я вважаю, що використовувати # - це не дуже гарна ідея. Json близький до синтаксису літералу Javascript. Javascript підтримує 2 типи коментарів: // та / * ... * / Якби я був ти, я би дотримувався одного або обох цих типів коментарів.
Паскаль Ганей

28

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

JSON не має коментарів. Кодер JSON НЕ МОЖЕ виводити коментарі. Декодер JSON МОЖЕ приймати та ігнорувати коментарі.

Коментарі ніколи не повинні використовуватися для передачі нічого значимого. Саме для цього і JSON.

Cf: Дуглас Крокфорд, автор спец . JSON


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

28

Це залежить від вашої бібліотеки JSON. Json.NET підтримує JavaScript коментар стилю, /* commment */.

Дивіться ще одне запитання про переповнення стека .


І я вважаю, що тому я бачу коментар на скріншоті на цій сторінці попереднього перегляду ASP.NET vNext (під package.json): blogs.msdn.com/b/webdev/archive/2014/06/03/…, хоча у мене немає У специфікації ще нічого не знайшли.
webXL

27

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

Якщо люди мають вагомі причини проти коментарів у JSON під час передачі даних (чи дійсні вони чи ні), можливо, JSON можна розділити на два:

  • JSON-COM: JSON на дроті або правила, які застосовуються під час передачі даних JSON.
  • JSON-DOC: документ JSON або JSON у файлах або локально. Правила, що визначають дійсний документ JSON.

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

Що стосується зауваження Дугласа Крокфорда з цього приводу (на яке посилається @Artur Czajka)

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

Ми говоримо про загальну проблему з конфігураційним файлом (перехресна мова / платформа), і він відповідає за допомогою спеціальної утиліти JS!

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

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


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

json5.org - це рішення для json-doc
Michael Freidgeim

24

Якщо ви використовуєте JSON5, ви можете включати коментарі.


JSON5 - це запропоноване розширення до JSON, яке має на меті полегшити людину писати та підтримувати вручну. Це робиться, додаючи деякі мінімальні функції синтаксису безпосередньо з ECMAScript 5.


5
Не могли б ви додати приклад? Тоді вам можуть знадобитися ці зайві символи.
dgilperez

6
Відповідно до вказівок ПС, це потрібно, щоб дати реальну відповідь. Відповіді лише для посилань не бажані. Ви можете перевірити керівні принципи stackoverflow.com/help/how-to-answer
dgilperez

2
SO модерується своїми користувачами. Це означає, що я можу надати відповідь, якщо у мене є так само, як я можу коментувати вашу, якщо вона не відповідає вказівкам. Ось так SO стає чудовим ресурсом.
dgilperez

22

Інструментарій JavaScript Dojo Toolkit JavaScript (принаймні, версія 1.4) дозволяє включати коментарі до вашого JSON. Коментарі можуть бути /* */форматними. Інструментарій Dojo споживає JSON через dojo.xhrGet()дзвінок.

Інші набори інструментів JavaScript можуть працювати аналогічно.

Це може бути корисно при експерименті з альтернативними структурами даних (або навіть списками даних) перед вибором остаточного варіанту.


4
Ні. Не це. JSON не має коментарів. Якщо ви вирішите анотувати свій JSON за допомогою коментарів, змініть його перед розбором або передачею. Це не повинно бути відповідальністю одержувача.
toolbear

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

1
Погано вуду подавати коментовані, і, таким чином, недійсні JSON, що dojo.xhrGet()неявно заохочує, приймаючи.
toolbear

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

20

JSON - це не оформлений протокол . Це формат, вільний від мови . Отже, формат коментаря для JSON не визначений.

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


18

Ви можете мати коментарі в JSONP , але не в чистому JSON. Я щойно витратив годину, намагаючись змусити свою програму працювати з цим прикладом із Highcharts: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

Якщо ви перейдете за посиланням, ви побачите

?(/* AAPL historical OHLC data from the Google Finance API */
[
/* May 2006 */
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);

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

Врешті-решт я просто надіслав запит HTTP вручну за вказаною вище адресою і зрозумів, що тип вмісту був, text/javascriptоскільки JSONP повертає чистий JavaScript. У цьому випадку коментарі дозволені . Але моя програма повернула тип вмісту application/json, тому мені довелося видалити коментарі.


17

Це питання "чи можете ви" . І ось відповідь "так" .

Ні, не слід використовувати дублюючі члени об’єктів для введення даних бічних каналів у кодування JSON. (Див. "Імена в об'єкті повинні бути унікальними" в RFC ).

І так, ви можете вставити коментарі навколо JSON , які ви могли б розібрати.

Але якщо ви хочете спосіб вставки та вилучення довільних даних бічного каналу до дійсного JSON, ось відповідь. Ми скористаємося унікальним поданням даних у кодуванні JSON. Це дозволено * у другому розділі RFC у розділі "пробіл дозволений до або після будь-якого з шести структурних символів".

* RFC заявляє лише, що "пробіл дозволений до або після будь-якого з шести структурних символів", не чітко згадуючи рядки, числа, "false", "true" та "null". Цей упущення ігнорується у ВСІХ реалізаціях.


По-перше, канонізуйте свій JSON, мінімізуючи його:

$jsonMin = json_encode(json_decode($json));

Потім кодуйте свій коментар у двійковій формі:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

Тоді налаштуйте свій двійковий файл:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

Ось ваш результат:

$jsonWithComment = $steg . $jsonMin;

1
RFC заявляє лише, що "пробіл дозволений до або після будь-якого з шести структурних символів", не чітко згадуючи рядки, числа, "false", "true", "null". Цей упущення ігнорується у ВСІХ реалізаціях.
Вільям Ентрікен

1
Для більшої щільності коментарів, ви не могли кодувати свій коментар у потрійному вікні та використати пробіл, вкладку та новий рядок, щоб зафіксувати його?
Клер Нільсен

ПОТРІБНО НЕ ОБОВ'ЯЗКОВО. Див. Чітко включений RFC 2119: ОБОВ'ЯЗКОВО: Це слово або терміни "ПОТРІБНО" або "ОБОВ'ЯЗКОВО" означають, що визначення є абсолютною вимогою специфікації. ... ОБОВ'ЯЗКОВО: Це слово або прикметник "РЕКОМЕНДОВАНО" означають, що в певних обставинах можуть існувати вагомі причини ігнорувати певний предмет, але повне значення слід розуміти і ретельно зважувати перед вибором іншого курсу.
Джефф К

Хороша довідка. Кращим міркуванням проти використання дублюваних ключів є цитата стандарту "Коли імена всередині об'єкта не є унікальними, поведінка програмного забезпечення, яке отримує такий об'єкт, непередбачуване". Також тепер я розумію, чому стандарт не "ОБОВ'ЯЗКОВО бути унікальним", це робить валідатор простішим, його потрібно лише відстежувати [і {, не потрібно знати, які ключі вже використовувалися.
Вільям Ентрікен

16

ВІДМОВА ВІДПОВІДАЛЬНІСТЬ: Це СУМЧО

Насправді є спосіб додавати коментарі та залишатися в межах специфікації (не потрібен додатковий синтаксичний аналіз). Це не призведе до читабельних для людини коментарів без будь-якого аналізу.

Ви можете зловживати наступним:

Незначний пробіл дозволений до або після будь-якого маркера. Пробіл - це будь-яка послідовність одного або декількох з наступних кодів: табуляція символів (U + 0009), подача рядків (U + 000A), повернення каретки (U + 000D) та пробіл (U + 0020).

Гакітним способом ви можете зловживати цим, щоб додати коментар. Наприклад: запустіть і закінчіть коментар на вкладці. Кодуйте коментар у base3 та використовуйте інші символи пробілу для їх представлення. Наприклад.

010212 010202 011000 011000 011010 001012 010122 010121 011021 010202 001012 011022 010212 011020 010202 010202

( hello base threeв ASCII) Але замість 0 використовувати простір, для 1 каналу рядка та 2 повернення каретки.

Це просто залишить вам багато нечитабельних пробілів (якщо ви не зробите плагін IDE, щоб кодувати / декодувати його на льоту).

Я ніколи навіть цього не пробував, з очевидних причин, і ні з вами.


12

Ми використовуємо strip-json-commentsдля нашого проекту. Він підтримує щось на кшталт:

/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

Просто npm install --save strip-json-commentsвстановити та використовувати його так:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}

Зауважте, що цей документ jsonвже не є дійсним JSON, якщо він включає ці коментарі щодо пристойності.
Рой Прінс

12

У моєму випадку мені потрібно використовувати коментарі для цілей налагодження до виходу структури JSON. Тому я вирішив використовувати інформацію про налагодження у заголовку HTTP, щоб не зламати клієнта:

header("My-Json-Comment: Yes, I know it's a workaround ;-) ");

Введіть тут опис зображення


12

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

Якщо ви спробуєте поставити коментарі в ( з використанням //або /* */або #, наприклад), то деякі парсери зазнає невдачі , тому що це не строго в межах специфікації JSON. Тож ніколи цього не слід робити.

Ось, наприклад, де моя система обробки зображень зберегла нотації зображень та деяку основну відформатовану інформацію (коментар), що стосується них (внизу):

{
    "Notations": [
        {
            "anchorX": 333,
            "anchorY": 265,
            "areaMode": "Ellipse",
            "extentX": 356,
            "extentY": 294,
            "opacity": 0.5,
            "text": "Elliptical area on top",
            "textX": 333,
            "textY": 265,
            "title": "Notation 1"
        },
        {
            "anchorX": 87,
            "anchorY": 385,
            "areaMode": "Rectangle",
            "extentX": 109,
            "extentY": 412,
            "opacity": 0.5,
            "text": "Rect area\non bottom",
            "textX": 98,
            "textY": 385,
            "title": "Notation 2"
        },
        {
            "anchorX": 69,
            "anchorY": 104,
            "areaMode": "Polygon",
            "extentX": 102,
            "extentY": 136,
            "opacity": 0.5,
            "pointList": [
                {
                    "i": 0,
                    "x": 83,
                    "y": 104
                },
                {
                    "i": 1,
                    "x": 69,
                    "y": 136
                },
                {
                    "i": 2,
                    "x": 102,
                    "y": 132
                },
                {
                    "i": 3,
                    "x": 83,
                    "y": 104
                }
            ],
            "text": "Simple polygon",
            "textX": 85,
            "textY": 104,
            "title": "Notation 3"
        }
    ],
    "imageXW": 512,
    "imageYW": 512,
    "imageName": "lena_std.ato",
    "tinyDocs": {
        "c01": "JSON image notation data:",
        "c02": "-------------------------",
        "c03": "",
        "c04": "This data contains image notations and related area",
        "c05": "selection information that provides a means for an",
        "c06": "image gallery to display notations with elliptical,",
        "c07": "rectangular, polygonal or freehand area indications",
        "c08": "over an image displayed to a gallery visitor.",
        "c09": "",
        "c10": "X and Y positions are all in image space. The image",
        "c11": "resolution is given as imageXW and imageYW, which",
        "c12": "you use to scale the notation areas to their proper",
        "c13": "locations and sizes for your display of the image,",
        "c14": "regardless of scale.",
        "c15": "",
        "c16": "For Ellipses, anchor is the  center of the ellipse,",
        "c17": "and the extents are the X and Y radii respectively.",
        "c18": "",
        "c19": "For Rectangles, the anchor is the top left and the",
        "c20": "extents are the bottom right.",
        "c21": "",
        "c22": "For Freehand and Polygon area modes, the pointList",
        "c23": "contains a series of numbered XY points. If the area",
        "c24": "is closed, the last point will be the same as the",
        "c25": "first, so all you have to be concerned with is drawing",
        "c26": "lines between the points in the list. Anchor and extent",
        "c27": "are set to the top left and bottom right of the indicated",
        "c28": "region, and can be used as a simplistic rectangular",
        "c29": "detect for the mouse hover position over these types",
        "c30": "of areas.",
        "c31": "",
        "c32": "The textx and texty positions provide basic positioning",
        "c33": "information to help you locate the text information",
        "c34": "in a reasonable location associated with the area",
        "c35": "indication.",
        "c36": "",
        "c37": "Opacity is a value between 0 and 1, where .5 represents",
        "c38": "a 50% opaque backdrop and 1.0 represents a fully opaque",
        "c39": "backdrop. Recommendation is that regions be drawn",
        "c40": "only if the user hovers the pointer over the image,",
        "c41": "and that the text associated with the regions be drawn",
        "c42": "only if the user hovers the pointer over the indicated",
        "c43": "region."
    }
}

Посилання "міркування" розірвано. Будь-який шанс знайти поточне посилання на нього?
Дон Хетч

Дон, на жаль, Google убив систему соціальних медіа, яка містила допис; Я не маю уявлення, куди звідти пішов оригінальний плакат, якщо де. Я вб'ю посилання у наведеній вище інформації, однак, щоб усунути неоднозначність. Дякую.
fyngyrz

Міркування не дурні, і ви це просто довели. Реалізація коментарів як тегів зберігає сумісність . Це саме те, чому Крокфорд хотів коментарі аналізованого як теги. Тепер все просто тег і аналогічно розібраний .
Домінік

Якщо специфікація заявила, що "рядок, що починається з #, - коментар", то це було б цілком сумісно. Як тепер, коментарі завантажують простір аналізатора, оскільки вони є дійсними проаналізованими елементами, а не вважаються коментарями, і вони можуть бути різними для кожного наявного .json-файлу. Якщо якщо (наприклад) специфікація сказала "рядки, що починаються з #, - це коментарі", то парсери можуть пропустити ці рядки без розбору (швидше) і не завантажувати пробірний простір (краще використання пам’яті.) Вже відсутності користі від нестачі коментарів у .json, лише мінуси.
fyngyrz

11

Щоб вирізати елемент JSON на частини, я додаю рядки "фіктивний коментар":

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}

15
Ви імітували структуру файлів INI в JSON. Будь ласка, відкладіть свій Золотий молоток.
Артур Чайка

4
RFC каже, що "Імена в об'єкті повинні бути унікальними". Також бачити цю людину , який , має помилку парсинга JSON , як вище: stackoverflow.com/questions/4912386 / ...
Вільям Entriken

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

1
Якщо ви дійсно налаштовані додавати коментарі до свого JSON, було б набагато більше сенсу робити щось подібне: { "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." } це зберігає ім'я унікальним і дозволяє додавати будь-яке значення рядка. Це все ще хитрість, адже коментарі не повинні бути частиною вашого JSON. Як інша альтернатива, чому б не додати коментарі до або після вашого JSON, але не всередині нього?
Язимов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.