Можно ли использовать комментарии в формате JSON? - PullRequest
6607 голосов
/ 28 октября 2008

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

Ответы [ 47 ]

4714 голосов
/ 29 октября 2008

Нет.

Все данные 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"
            }
         }
      }
   }
}
1688 голосов
/ 15 ноября 2010

Нет , комментарии в форме //… или /*…*/ не допускаются в JSON. Этот ответ основан на:

  • http://www.json.org
  • RFC 4627 : application/json Тип носителя для нотации объектов JavaScript (JSON)
  • RFC 7159 Формат обмена данными нотации объектов JavaScript (JSON) - устарело: 4627, 7158
742 голосов
/ 23 июня 2010

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

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

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

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

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

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

402 голосов
/ 11 июня 2012

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

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

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

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

200 голосов
/ 02 августа 2013

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Ваша гарантия аннулирована

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

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

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

152 голосов
/ 20 марта 2014

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

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

Hjson intro

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

103 голосов
/ 31 августа 2011

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

100 голосов
/ 28 октября 2008

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

На этой странице представлен синтаксис JSON. Нет комментариев о комментариях.

65 голосов
/ 28 июля 2010

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

Пример:

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

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

58 голосов
/ 07 февраля 2014

Если вы используете Джексона в качестве парсера JSON, то вы можете разрешить комментарии следующим образом:

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

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

{
  key: "value" // Comment
}

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

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...