Могут ли комментарии использоваться в JSON?

Можно ли использовать комментарии в файле JSON? Если да, то как?

5054
задан Michael Gundlach 28 окт. '08 в 23:39
источник поделиться

44 ответов

  • 1
  • 2

Я не верю, что у вас есть реальный комментарий. 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"
            }
         }
      }
   }
}
3439
ответ дан Eli 29 окт. '08 в 0:01
источник поделиться

Нет, комментарии формы //… или /*…*/ не разрешены в JSON. Этот ответ основан на:

  • http://www.json.org
  • RFC 4627: application/json Тип носителя для обозначения объекта JavaScript (JSON)
  • RFC 7159 Формат обмена данными JavaScript (JSON) - Obsoletes: 4627, 7158
1441
ответ дан stakx 15 нояб. '10 в 12:32
источник поделиться

Включить комментарии, если вы выберете; выставьте их с помощью minifier перед синтаксическим разбором или передачей.

Я только что выпустил JSON.minify(), который удаляет комментарии и пробелы из блока JSON и делает это действительный JSON, который может быть проанализирован. Итак, вы можете использовать его как:

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

Когда я его выпустил, я получил огромную реакцию людей, которые не согласны с этой идеей, поэтому я решил, что напишу полный блог о том, почему комментарии имеют смысл в JSON. Он включает в себя этот замечательный комментарий от создателя JSON:

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

Надеюсь, что это полезно для тех, кто не согласен с тем, почему JSON.minify() может быть полезным.

600
ответ дан Kyle Simpson 23 июня '10 в 21:20
источник поделиться

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

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

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

Источник: Публичное выражение Дугласа Крокфорда о G +

338
ответ дан Artur Czajka 11 июня '12 в 11:52
источник поделиться

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: ВАША ГАРАНТИЯ ГОЛОСОВАЛА

Как уже отмечалось, этот хак использует преимущества спецификации. Не все парнеры 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]
}

Это означает, что комментариев нет, и у них не будет странных побочных эффектов.

Счастливый взлом!

167
ответ дан Ped 02 авг. '13 в 16:46
источник поделиться

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

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

Hjson intro

Смотрите hjson.org для библиотек JavaScript, Java, Python, PHP, Rust, Go, Ruby и С#.

88
ответ дан laktak 20 марта '14 в 18:26
источник поделиться

Вы не можете. По крайней мере, мой опыт от быстрого взгляда на json.org.

JSON имеет синтаксис, отображаемый на этой странице. Нет комментариев о комментариях.

86
ответ дан Cheery 28 окт. '08 в 23:42
источник поделиться

Рассмотрим использование YAML. Это почти надмножество JSON (фактически все действительные JSON действительны YAML), и он позволяет комментировать.

74
ответ дан Marnen Laibow-Koser 31 авг. '11 в 5:24
источник поделиться

Вместо этого вы должны написать схему JSON. Схема JSON в настоящее время является предлагаемой спецификацией проекта Интернета. Помимо документации, схема также может использоваться для проверки ваших данных JSON.

Пример:

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

Вы можете предоставить документацию, используя атрибут описание.

51
ответ дан raffel 28 июля '10 в 21:38
источник поделиться

Комментарии не являются официальным стандартом. Хотя некоторые парсеры поддерживают комментарии в стиле С. Я использую 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.

44
ответ дан schoetbi 26 окт. '11 в 12:46
источник поделиться

Если вы используете Jackson в качестве своего парсера JSON, тогда вы разрешаете ему давать комментарии:

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

Тогда у вас могут быть такие комментарии:

{
  key: "value" // comment
}

И вы также можете оставить комментарии, начиная с #, установив:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);    

Но в целом (как было сказано ранее) спецификация не позволяет комментировать.

38
ответ дан Andrejs 06 февр. '14 в 23:44
источник поделиться

Извините, мы не можем использовать комментарии в JSON... См. диаграмму синтаксиса для JSON на JSON.org.

Дуглас Крокфорд говорит: " почему он удалил комментарии в JSON и предоставил альтернативный способ сделать это":

Я удалил комментарии от JSON, потому что видел, как люди использовали их для придерживаться директив синтаксического анализа, практики, которая уничтожила бы совместимость. Я знаю, что отсутствие комментариев заставляет некоторых людей грустно, но это не должно быть.

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

35
ответ дан NavaRajan 08 нояб. '12 в 10:44
источник поделиться

Если ваш текстовый файл, который является строкой JSON, будет прочитан какой-либо программой, насколько сложно было бы вырезать комментарии стиля C или С++ до его использования?

Ответ: Это будет один лайнер. Если вы это сделаете, то файлы JSON могут быть использованы в качестве файлов конфигурации.

34
ответ дан John T. Vonachen 10 апр. '10 в 1:30
источник поделиться

Вот что я нашел в документации Google Firebase, которая позволяет добавлять комментарии в JSON:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project sender ID",
  "gcm_sender_id": "1234567890"
}
22
ответ дан mana 22 июня '17 в 15:58
источник поделиться

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

У JSON нет комментариев. Кодер JSON НЕ ДОЛЖЕН выводить комментарии. Декодер JSON МОЖЕТ принимать и игнорировать комментарии.

Комментарии никогда не должны использоваться для передачи каких-либо значимых замечаний. То есть для чего JSON.

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

22
ответ дан gaborous 25 июня '13 в 17:48
источник поделиться

Я просто сталкиваюсь с этим для файлов конфигурации. Я не хочу использовать XML (подробный, графически, уродливый, трудно читаемый) или "ini" (без иерархии, без реального стандарта и т.д.) Или в формате Java "Свойства" ( например .ini).

JSON может делать все, что они могут, но это намного менее подробный и более удобный для восприятия язык, и парсеры легко и повсеместно распространены на многих языках. Это просто дерево данных. Но внеполосные комментарии часто требуют документирования конфигураций "по умолчанию" и тому подобного. Конфигурации никогда не должны быть "полными документами", но деревья сохраненных данных, которые могут быть удобочитаемыми по мере необходимости.

Я думаю, можно использовать "#": "comment", для "valid" JSON.

22
ответ дан peterk 22 июня '11 в 16:09
источник поделиться

Если вы используете библиотеку Newtonsoft.Json с ASP.NET для чтения/десериализации, вы можете использовать комментарии в содержимом JSON:

// "name": "string"

// "id": int

или

/* Это

Пример комментария

*/

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

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

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

Я думаю, что это "проще использовать/понимать", чем создавать отдельный файл settings.README и объяснять настройки в нем.

Если у вас есть проблемы с этим видом использования; извините, джина вне лампы. Люди могли бы найти другие способы использования формата JSON, и вы ничего не можете с этим поделать.

21
ответ дан dvdmn 25 июля '14 в 16:43
источник поделиться

Идея JSON заключается в обеспечении простого обмена данными между приложениями. Обычно они основаны на веб-интерфейсах, а язык - это JavaScript.

Это действительно не позволяет комментировать как таковой, однако, передавать комментарий, поскольку одна из пар имя/значение в данных, безусловно, будет работать, хотя эти данные, очевидно, должны быть проигнорированы или обработаны специально кодом разбора.

Все, что говорилось, это не намерение, что файл JSON должен содержать комментарии в традиционном смысле. Это должны быть только данные.

Подробнее см. веб-сайт JSON.

21
ответ дан Neil Albrock 29 окт. '08 в 2:05
источник поделиться

Это зависит от вашей библиотеки JSON. Json.NET поддерживает комментарии в стиле JavaScript /* commment */.

См. еще один вопрос о переполнении стека.

20
ответ дан AZ. 04 авг. '12 в 3:56
источник поделиться

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

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

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

JSON-DOC позволит комментировать, и могут существовать другие незначительные отличия, такие как обработка пробелов. Парсеры могут легко конвертировать из одной спецификации в другую.

Что касается замечания , сделанного Дугласом Крокфордом по этим вопросам (ссылка на @Artur Czajka)

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

Мы говорим об общей проблеме с конфигурационным файлом (кросс-язык/платформа), и он отвечает с помощью специальной утилиты JS!

Уверенный, что JSON-специфический minify может быть реализован на любом языке, но стандартизируйте это, чтобы он стал повсеместным для парсеров на всех языках и платформах, поэтому люди перестают тратить свое время на отсутствие функции, потому что у них есть хорошие прецеденты, глядя на проблему на онлайн-форумах и заставляя людей говорить им, что это плохая идея или предлагая легко реализовать снятие комментариев из текстовых файлов.

Другая проблема - совместимость. Предположим, у вас есть библиотека или API или любая подсистема, в которой есть некоторые файлы конфигурации или данных, связанные с ней. И эта подсистема для доступа с разных языков. Тогда вы рассказываете людям: кстати не забудьте вычеркнуть комментарии из файлов JSON, прежде чем передавать их в парсер!

19
ответ дан Basel Shishani 11 дек. '12 в 4:37
источник поделиться

У вас могут быть комментарии в 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
ответ дан osa 07 окт. '13 в 23:37
источник поделиться

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

Другие инструментальные средства JavaScript могут работать аналогичным образом.

Это может быть полезно при экспериментировании с альтернативными структурами данных (или даже списками данных) перед выбором окончательной опции.

17
ответ дан David 19 янв. '11 в 0:57
источник поделиться

JSON не является файловым протоколом. Это свободный от языка формат. Поэтому формат комментария для JSON не определен.

Как и многие люди, есть некоторые трюки, например дублирующие ключи или определенный ключ _comment, который вы можете использовать. Это зависит от вас.

16
ответ дан Manish Shrivastava 20 июля '15 в 12:26
источник поделиться

Если вы используете JSON5, вы можете включать комментарии.


JSON5 - это предлагаемое расширение для JSON, целью которого является упрощение для людей записи и поддержки вручную. Он делает это, добавляя некоторые минимальные синтаксические особенности непосредственно из ECMAScript 5.

15
ответ дан Smit Johnth 24 нояб. '15 в 7:34
источник поделиться

Это вопрос "вы можете. И вот ответ " да".

Нет, вы не должны использовать дублирующих членов объекта для заполнения данных бокового канала в кодировке JSON. (См. "Имена внутри объекта ДОЛЖНЫ быть уникальными" в RFC).

И да, вы могли бы вставить комментарии вокруг JSON, которые вы могли бы разобрать.

Но если вы хотите способ вставки и извлечения произвольных данных бокового канала в действительный JSON, вот ответ. Мы используем уникальное представление данных в кодировке JSON. Это разрешено * во втором разделе RFC в разделе "Пробелы разрешены до или после любого из шести структурных символов".

* RFC утверждает, что "пробелы разрешены до или после любого из шести структурных символов", не указывая явно строки, числа, "ложь", "истина" и "ноль". Это упущение игнорируется во всех реализациях.


Сначала канонизируйте свой 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;
14
ответ дан Full Decent 24 апр. '14 в 20:23
источник поделиться

Существует хорошее решение (взломать), которое действительно JSON. Просто сделайте один и тот же ключ дважды (или больше). Например:

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

Итак, JSON поймет это как:

{
  "param" : "This is value place",
}
10
ответ дан Aurys 28 янв. '14 в 18:04
источник поделиться

Мы используем 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'}
10
ответ дан Joy 27 нояб. '14 в 14:39
источник поделиться

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

{

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

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

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

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

}
9
ответ дан Chris 29 окт. '13 в 13:30
источник поделиться

Автор JSON хочет, чтобы мы включили комментарии в JSON, но разделили их перед их разбором (см. ссылка, предоставленную Майклом Берром. ) Если JSON должен иметь комментарии, почему бы не стандартизировать их и позволить парсера JSON выполнять эту работу? Я не согласен с логикой там, но, увы, это стандарт. Использование решения YAML, как предложено другими, является хорошим, но требует зависимости от библиотеки.

Если вы хотите отключить комментарии, но не хотите иметь зависимость от библиотеки, вот двухстрочное решение, которое работает для комментариев в стиле С++, но может быть адаптировано для других:

var comments=new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

Обратите внимание, что это решение может использоваться только в тех случаях, когда вы можете быть уверены, что данные JSON не содержат инициатор комментария, например. ( '//').

Другой способ добиться разбора JSON, снятия комментариев и дополнительной библиотеки - оценить JSON в интерпретаторе JS. Разумеется, оговорка с этим подходом состоит в том, что вы хотели бы просто оценить неиспользуемые данные (без ненадежного ввода пользователя). Ниже приведен пример этого подхода в node.js - другое предостережение, следующий пример будет читать только данных один раз, а затем он будет кэшироваться:

data = require(fs.realpathSync(doctree_fp));
7
ответ дан Joshua Richardson 07 дек. '13 в 0:46
источник поделиться

Вы можете использовать JSON с комментариями в нем, если вы загрузите его как текстовый файл, а затем удалите с него комментарии.

Вы можете использовать decomment библиотеку. Ниже приведен полный пример.

Вход JSON (файл input.js):

/*
* multi-line comments
**/
{
    "value": 123 // one-line comment
}

тестовое приложение:

var decomment = require('decomment');
var fs = require('fs');

fs.readFile('input.js', 'utf8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        var text = decomment(data); // removing comments
        var json = JSON.parse(text); // parsing JSON
        console.log(json);
    }
});

Вывод:

{ value: 123 }

Смотрите также: gulp-decomment, grunt-decomment

7
ответ дан vitaly-t 29 дек. '16 в 8:12
источник поделиться
  • 1
  • 2

Другие вопросы по меткам