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

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

6201
задан 28 окт. '08 в 23:39
источник поделиться
48 ответов
  • 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"
            }
         }
      }
   }
}
4379
ответ дан 29 окт. '08 в 0:01
источник

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

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

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

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

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

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

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

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

717
ответ дан 23 июня '10 в 21:20
источник

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

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

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

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

393
ответ дан 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]
}

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

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

199
ответ дан 02 авг. '13 в 16:46
источник

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

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

Hjson intro

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

138
ответ дан 20 марта '14 в 18:26
источник

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

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

97
ответ дан 28 окт. '08 в 23:42
источник

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

94
ответ дан 31 авг. '11 в 5:24
источник

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

Пример:

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

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

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

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

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

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

{
  key: "value" // Comment
}

Кроме того, у вас также могут быть комментарии, начинающиеся с # путем установки:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

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

54
ответ дан 06 февр. '14 в 23:44
источник

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

53
ответ дан 26 окт. '11 в 12:46
источник

Вот что я нашел в документации 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"
}
44
ответ дан 22 июня '17 в 15:58
источник

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

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

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

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

40
ответ дан 08 нояб. '12 в 10:44
источник

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

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

37
ответ дан 10 апр. '10 в 1:30
источник

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

// "name": "string"

// "id": int

или

/* Это

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

*/

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

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

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

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

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

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

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

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

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

Посмотрите на сайт JSON для более подробной информации.

28
ответ дан 29 окт. '08 в 2:05
источник

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

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

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

27
ответ дан 22 июня '11 в 16:09
источник

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

См. Другой вопрос о переполнении стека.

26
ответ дан 04 авг. '12 в 3:56
источник

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

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

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

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

26
ответ дан 25 июня '13 в 17:48
источник

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, прежде чем передавать их в парсер!

23
ответ дан 11 дек. '12 в 4:37
источник

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


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

20
ответ дан 24 нояб. '15 в 7:34
источник

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

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

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

20
ответ дан 19 янв. '11 в 0:57
источник

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

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

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

17
ответ дан 20 июля '15 в 12:26
источник

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

Нет, вы не должны использовать дублирующих членов объекта для заполнения данных бокового канала в кодировке 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;
16
ответ дан 24 апр. '14 в 20:23
источник

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

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

{

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

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

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

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

}
10
ответ дан 29 окт. '13 в 13:30
источник

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

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

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

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

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

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

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

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

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

data = require(fs.realpathSync(doctree_fp));
9
ответ дан 07 дек. '13 в 0:46
источник

JSON использовался для поддержки комментариев, но их злоупотребляли и удаляли из стандарта.

От создателя JSON:

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

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

JSON по дизайну - это простая обратная инженерия (человеческая синтаксическая) альтернатива XML. Это упрощается даже до такой степени, что аннотации не нужны. Это даже не язык разметки. Цель межоперабельна.

Любой, кто понимает отношение "has-a" объектной ориентации, может понять любую структуру JSON - вот и все. Это просто ориентированный ациклический граф (DAG) с тегами узлов (пары ключ/значение), который является почти универсальной структурой данных.

Эта требуемая аннотация может быть "//Это теги DAG". Названия ключей могут быть столь же информативными, как требуется.

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

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

8
ответ дан 27 нояб. '15 в 22:35
источник
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос