Могу ли я использовать комментарии внутри файла JSON? Если да, то как?
Можно ли использовать комментарии в JSON?
Ответы (57)
No.
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"
}
}
}
}
}
"__comment":"comment text goes here...",
- person Rob Fonseca-Ensor; 03.02.2010
Accronym
и Abbrev
? Я использовал этот шаблон раньше, но остановился, поскольку он не позволяет мне этого делать. Это взлом. Может быть, если вместо этого я добавлю к имени свойства __comment__
. Это __comment__Abbrev, все еще хакерский, но я бы позволил мне прокомментировать все возможности.
- person Juan Mendes; 11.08.2014
{"<!-- glossary -->": "Comment text"}
выглядит нормально. "/* glossary */"
тоже.
- person vp_arth; 19.12.2014
GlossList
не является массивом (GlossList: [ { .. }, { .. } ]
)?
- person Luca Steeb; 12.05.2015
[ "line 1", <CRLF> "line 2", <CRLF> "line 3" ]
.
- person TripeHound; 09.10.2015
5
относится к ECMAScript 5 (и более поздние версии)).
- person Peter Mortensen; 19.01.2017
{"//": "Your comment"}
- person danger89; 20.03.2018
JSMin
, прежде чем передать его парсеру JSON, - Дуглас Крокфорд
- person chb; 17.09.2018
_comment
также является официальным обходным путем в composer.json, как указано композитором и автором Селдэком в - person noobish; 02.02.2019
__comment
? Нам понадобится новое поле ___comment
.
- person null; 08.03.2019
Error: Unknown option: _comment.
- person Thielicious; 25.06.2020
Нет, комментарии формы //…
или /*…*/
не допускаются в JSON. Этот ответ основан на:
- https://www.json.org
- RFC 4627:
application/json
Тип мультимедиа для нотации объектов JavaScript (JSON) - RFC 8259 Формат обмена данными JavaScript Object Notation (JSON) (заменяет RFC 4627, 7158, 7159)
_comment
, как указано в принятом ответе.
- person PixelMaster; 10.07.2019
_comment
, поэтому давайте не будем прибегать к подобным взломам в JSON.
- person d512; 10.07.2019
Включите комментарии, если хотите; удалите их с помощью минификатора перед синтаксическим анализом или передачей.
Я только что выпустил JSON.minify (), который удаляет комментарии и пробелы. из блока JSON и делает его действительным JSON, который может быть проанализирован. Итак, вы можете использовать это как:
JSON.parse(JSON.minify(my_str));
Когда я его выпустил, я получил огромное количество людей, не согласных даже с его идеей, поэтому я решил, что напишу подробный пост в блоге о том, почему комментарии имеют смысл в JSON. Он включает в себя этот примечательный комментарий создателя JSON:
Предположим, вы используете JSON для хранения файлов конфигурации, которые хотите аннотировать. Вставьте все комментарии, которые вам нравятся. Затем пропустите его через JSMin, прежде чем передать его парсеру JSON. - Дуглас Крокфорд, 2012 г.
Надеюсь, это поможет тем, кто не согласен с тем, почему JSON.minify () может быть полезен.
Комментарии были удалены из JSON по дизайну.
Я удалил комментарии из JSON, потому что видел, как люди использовали их для хранения директив синтаксического анализа, что привело бы к нарушению совместимости. Я знаю, что некоторых людей огорчает отсутствие комментариев, но этого не должно быть.
Предположим, вы используете JSON для хранения файлов конфигурации, которые хотите аннотировать. Вставьте все комментарии, которые вам нравятся. Затем пропустите его через JSMin, прежде чем передать его парсеру JSON.
Источник: Публичное заявление Дугласа Крокфорда в Google+
/* */
комментариев также сделало JSON лучшим подмножеством YAML.
- person Schwern; 29.11.2012
#
комментарии, так что ваша точка зрения вроде мутит
- person Juan Mendes; 04.04.2013
#
, а Javascript использует //
и /* */
. JSON не может использовать #
в качестве комментария, не становясь несовместимым с Javascript. JSON не может быть подмножеством YAML и Javascript и иметь комментарии.
- person Schwern; 05.04.2013
JSON не поддерживает комментарии. Он также никогда не предназначался для использования в файлах конфигурации, где потребуются комментарии.
Hjson - это формат файла конфигурации для людей. Упрощенный синтаксис, меньше ошибок, больше комментариев.
См. hjson.github.io для JavaScript, Java, Python, PHP, Rust, Go, Ruby, C ++ и C #. библиотеки.
package.json
).
- person Peter Mortensen; 08.10.2020
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: ВАША ГАРАНТИЯ НЕДЕЙСТВИТЕЛЬНА
Как уже указывалось, этот прием использует реализацию спецификации. Не все парсеры 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]
}
Это означает, что комментариев нет и у них не будет странных побочных эффектов.
Удачного взлома!
"_comment"
ключи, тогда вы получите лучшее из обоих миров.
- person depoulo; 05.08.2013
jsondecode
Matlab создаст поля api_host
и api_host_1
и т. Д.
- person user3240484; 29.10.2018
Рассмотрите возможность использования YAML. Это почти надмножество JSON (практически весь действительный JSON - это действительный YAML), и он позволяет комментарии.
yaml
библиотека не поставляется с Python.
- person Bleeding Fingers; 15.04.2014
Вы не можете. По крайней мере, таков мой опыт после беглого взгляда на json.org.
Синтаксис JSON визуализирован на этой странице. Нет никаких заметок о комментариях.
Комментарии не являются официальным стандартом, хотя некоторые парсеры поддерживают комментарии в стиле 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.
В последней версии nlohmann / json есть дополнительная поддержка игнорирования комментариев при синтаксическом анализе.
Вместо этого вам следует написать схему JSON. Схема JSON в настоящее время является предлагаемым проектом спецификации Интернета. Помимо документации, схему также можно использовать для проверки ваших данных JSON.
Пример:
{
"description":"A person",
"type":"object",
"properties":
{
"name":
{
"type":"string"
},
"age":
{
"type":"integer",
"maximum":125
}
}
}
Вы можете предоставить документацию, используя атрибут схемы description.
Если вы используете Jackson в качестве парсера JSON, то включите его, чтобы разрешить комментарии:
ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);
Тогда у вас могут быть такие комментарии:
{
key: "value" // Comment
}
И вы также можете иметь комментарии, начинающиеся с #
, установив:
mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);
Но в целом (как уже было сказано) спецификация не допускает комментариев.
Вот что я нашел в документации 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"
}
НЕТ. Раньше JSON поддерживал комментарии, но они подверглись злоупотреблениям и были удалены из стандарта.
От создателя JSON:
Я удалил комментарии из JSON, потому что видел, как люди использовали их для хранения директив синтаксического анализа, что привело бы к нарушению совместимости. Я знаю, что некоторых людей огорчает отсутствие комментариев, но этого не должно быть. - Дуглас Крокфорд, 2012 г.
Официальный сайт JSON находится по адресу JSON.org. JSON определен как стандарт ECMA International. Всегда существует процесс прошения о пересмотре стандартов. Вряд ли аннотации будут добавлены в стандарт JSON по нескольким причинам.
JSON по замыслу - это легко реверсивная (анализируемая человеком) альтернатива XML. Он упрощен до такой степени, что аннотации не нужны. Это даже не язык разметки. Цель - стабильность и совместимость.
Любой, кто понимает взаимосвязь объектной ориентации «имеет-а», может понять любую структуру JSON - в этом весь смысл. Это просто ориентированный ациклический граф (DAG) с тегами узлов (парами ключ / значение), который представляет собой почти универсальную структуру данных.
Эта единственная необходимая аннотация может быть такой: «// Это теги DAG». Имена ключей могут быть настолько информативными, насколько это необходимо, что допускает произвольную семантическую арность.
Любая платформа может анализировать JSON с помощью всего нескольких строк кода. XML требует сложных объектно-ориентированных библиотек, которые не работают на многих платформах.
Аннотации только сделают JSON менее совместимым. Больше просто нечего добавить, если только вам действительно не нужен язык разметки (XML), и вам все равно, легко ли анализируются ваши сохраненные данные.
НО, как заметил и создатель JSON, всегда существовала поддержка конвейера JS для комментариев:
Вставьте все комментарии, которые вам нравятся. Затем пропустите его через JSMin, прежде чем передать его парсеру JSON. - Дуглас Крокфорд, 2012 г.
Если ваш текстовый файл, представляющий собой строку JSON, будет прочитан какой-либо программой, насколько сложно будет удалить комментарии в стиле C или C ++ перед его использованием?
Ответ: Это будет однострочный. Если вы это сделаете, файлы JSON можно будет использовать в качестве файлов конфигурации.
myJson.replace(/("\/\/.*"|"\/\*(?:.|\n)*?")|(\/\/.*|\/\*(?:.|\n)*?\*\/)/g, "$1")
regexr.com/3p39p
- person Maxim Paperno; 08.05.2018
Если вы используете библиотеку Newtonsoft.Json с ASP.NET для чтения / десериализации, вы можете использовать комментарии в содержимом JSON:
// имя: строка
// id: int
or
/* Это
пример комментария * /
PS: Однострочные комментарии поддерживаются только в 6+ версиях Newtonsoft Json.
Дополнительное примечание для людей, которые не могут мыслить нестандартно. Я использую формат JSON для основных настроек в созданном мной веб-приложении ASP.NET. Я читаю файл, конвертирую в объект настроек с библиотекой Newtonsoft и использую при необходимости.
Я предпочитаю писать комментарии о каждой отдельной настройке в самом файле JSON, и меня действительно не волнует целостность формата JSON, если библиотека, которую я использую, подходит для этого.
Я думаю, что это более простой способ использования / понимания, чем создание отдельного файла settings.README и объяснение в нем настроек.
Если у вас есть проблемы с таким использованием; извините, джинн из лампы. Люди найдут другие варианты использования формата JSON, и вы ничего не можете с этим поделать.
Идея JSON состоит в том, чтобы обеспечить простой обмен данными между приложениями. Обычно они основаны на Интернете, а язык - JavaScript.
На самом деле это не позволяет использовать комментарии как таковые, однако передача комментария в качестве одной из пар имя / значение в данных, безусловно, будет работать, хотя эти данные, очевидно, должны быть проигнорированы или обработаны специально кодом синтаксического анализа.
При этом не предполагается, что файл JSON должен содержать комментарии в традиционном смысле. Это должны быть просто данные.
Посетите веб-сайт JSON для получения более подробной информации.
JSON изначально не поддерживает комментарии, но вы можете создать свой собственный декодер или, по крайней мере, препроцессор, чтобы вырезать комментарии, что совершенно нормально (пока вы просто игнорируете комментарии и не используете их, чтобы определять, как ваше приложение должно обрабатывать данные JSON. ).
JSON не имеет комментариев. Кодировщик JSON НЕ ДОЛЖЕН выводить комментарии. Декодер JSON МОЖЕТ принимать и игнорировать комментарии.
Комментарии никогда не должны использоваться для передачи чего-либо значимого. Вот для чего нужен JSON.
См .: Дуглас Крокфорд, автор спецификации JSON.
Я просто сталкиваюсь с этим для файлов конфигурации. Я не хочу использовать XML (подробный, графически, некрасивый, трудно читаемый), или формат «ini» (без иерархии, без реального стандарта и т. Д.) Или формат «Свойства» Java ( как .ini).
JSON может делать все, что могут, но он менее подробен и более удобочитаем, а синтаксические анализаторы просты и повсеместны на многих языках. Это просто дерево данных. Но внеполосные комментарии часто необходимы для документирования конфигураций "по умолчанию" и тому подобного. Конфигурации никогда не должны быть «полными документами», а должны быть деревьями сохраненных данных, которые могут быть удобочитаемы при необходимости.
Думаю, можно использовать "#": "comment"
для «действительного» JSON.
Это зависит от вашей библиотеки JSON. Json.NET поддерживает комментарии в стиле JavaScript, /* commment */
.
См. еще один вопрос о переполнении стека.
JSON имеет большой смысл для файлов конфигурации и другого локального использования, поскольку он повсеместен и намного проще, чем XML.
Если у людей есть веские причины против использования комментариев в JSON при передаче данных (независимо от того, действительны они или нет), то, возможно, JSON можно разделить на два:
- JSON-COM: JSON на проводе или правила, применяемые при передаче данных JSON.
- JSON-DOC: документ JSON или JSON в файлах или локально. Правила, определяющие действительный документ JSON.
JSON-DOC допускает комментарии, и могут существовать другие незначительные отличия, такие как обработка пробелов. Парсеры могут легко преобразовывать одну спецификацию в другую.
Что касается замечания Дугласа Крокфорда по этому поводу (на которое ссылается @Artur Czajka)
Предположим, вы используете JSON для хранения файлов конфигурации, которые хотите аннотировать. Вставьте все комментарии, которые вам нравятся. Затем пропустите его через JSMin, прежде чем передать его парсеру JSON.
Мы говорим об общей проблеме с файлом конфигурации (кросс-язык / платформа), и он отвечает специальной утилитой JS!
Конечно, минификация, специфичная для JSON, может быть реализована на любом языке, но стандартизируйте ее, чтобы она стала повсеместной во всех парсерах на всех языках и платформах, чтобы люди перестали тратить свое время на отсутствие этой функции, потому что у них есть хорошие варианты использования для нее, ища проблему в онлайн-форумы, и заставить людей говорить им, что это плохая идея или предлагать легко реализовать удаление комментариев из текстовых файлов.
Другой вопрос - это совместимость. Предположим, у вас есть библиотека или API, или любая подсистема, с которой связаны некоторые файлы конфигурации или данных. И эта подсистема должна быть доступна с разных языков. Тогда вы начинаете рассказывать людям: кстати, не забудьте вырезать комментарии из файлов JSON, прежде чем передавать их парсеру!
Если вы используете JSON5, вы можете включать комментарии.
JSON5 - это предлагаемое расширение для JSON, цель которого - облегчить людям писать и поддерживать вручную. Это достигается за счет добавления некоторых минимальных синтаксических функций непосредственно из ECMAScript 5.
Набор инструментов Dojo Toolkit JavaScript (по крайней мере, начиная с версии 1.4) позволяет вам включать комментарии в ваш JSON. Комментарии могут иметь формат /* */
. Dojo Toolkit использует JSON через вызов dojo.xhrGet()
.
Другие инструменты JavaScript могут работать аналогичным образом.
Это может быть полезно при экспериментировании с альтернативными структурами данных (или даже списками данных) перед выбором окончательного варианта.
dojo.xhrGet()
неявно поощряет, принимая.
- person toolbear; 09.08.2014
JSON не является протоколом во фреймах. Это свободный от языка формат. Таким образом, формат комментария для JSON не определен.
Как предлагали многие, есть некоторые уловки, например, дублирование ключей или определенный ключ _comment
, которые вы можете использовать. Тебе решать.
Вы можете размещать комментарии в 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
, поэтому мне пришлось удалить комментарии.
Отказ от ответственности: это глупо
На самом деле есть способ добавлять комментарии и оставаться в рамках спецификации (дополнительный синтаксический анализатор не требуется). Однако это не приведет к появлению удобочитаемых комментариев без какого-либо анализа.
Вы можете злоупотребить следующим:
Незначительные пробелы разрешены до или после любого токена. Пробел - это любая последовательность из одной или нескольких следующих кодовых точек: табуляция символов (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 для его кодирования / декодирования на лету).
Я даже не пробовал это по понятным причинам, да и вам тоже.
Да, новый стандарт JSON5 разрешает комментарии в стиле C ++, среди многих другие расширения:
// A single line comment.
/* A multi-
line comment. */
Формат обмена данными JSON5 (JSON5) - это надмножество JSON, призванное облегчить некоторые ограничения JSON. Он полностью обратно совместим, и его использование, вероятно, лучше, чем написание нестандартного нестандартного парсера, включение нестандартных функций для существующего или использование различных хаков, таких как строковые поля для комментирования. Или, если используемый синтаксический анализатор поддерживает, просто согласитесь, мы используем подмножество JSON 5, то есть комментарии в стиле JSON и C ++. Это намного лучше, чем настраивать стандарт JSON так, как мы считаем нужным.
Уже существует пакет npm, пакет Python, пакет Java и C-библиотека. Он обратно совместим. Я не вижу причин оставаться с официальными ограничениями JSON.
Я думаю, что удаление комментариев из JSON было вызвано теми же причинами, что и удаление перегрузки оператора в Java: может использоваться неправильно, но некоторые явно законные варианты использования были упущены. Для перегрузки операторов это матричная алгебра и комплексные числа. Для комментариев JSON это файлы конфигурации и другие документы, которые могут быть написаны, отредактированы или прочитаны людьми, а не только парсером.
Это вопрос "можете ли вы". И вот ответ «да».
Нет, вы не должны использовать повторяющиеся элементы объекта для вставки данных побочного канала в кодировку 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;
JSON сам по себе не допускает комментариев. Рассуждения совершенно глупы, потому что вы можете использовать JSON сам для создания комментариев, что полностью устраняет рассуждения, и загружает пространство данных парсера без всякой уважительной причины для < em> точно тот же результат и потенциальные проблемы, такие как они: файл 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."
}
}
В нашем проекте мы используем 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, если он включает эти комментарии.
- person Roy Prins; 31.07.2019
Чтобы разрезать элемент JSON на части, я добавляю строки «фиктивного комментария»:
{
"#############################" : "Part1",
"data1" : "value1",
"data2" : "value2",
"#############################" : "Part2",
"data4" : "value3",
"data3" : "value4"
}
{ "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." }
Это сохраняет имя уникальным и позволяет вам добавлять любое строковое значение, которое вам нравится. Это все еще путаница, потому что комментарии не должны быть частью вашего JSON. В качестве другой альтернативы, почему бы не добавить комментарии до или после вашего JSON, но не внутри него?
- person Jazimov; 05.09.2015
Автор JSON хочет, чтобы мы включили комментарии в JSON, но удалили их перед анализом (см. ссылка предоставлена Майклом Берром). Если в JSON должны быть комментарии, почему бы не стандартизировать их и не позволить синтаксическому анализатору JSON делать всю работу? Я не согласен с логикой там, но, увы, это стандарт. Использование решения YAML, предложенного другими, - это хорошо, но для этого требуется зависимость от библиотеки.
Если вы хотите исключить комментарии, но не хотите иметь зависимость от библиотеки, вот двухстрочное решение, которое работает для комментариев в стиле C ++, но может быть адаптировано для других:
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));
cpp
для их удаления? (с cpp
из gcc
вы хотите использовать -P
(заглавная P), чтобы избежать записей # <line#> ...
.) Я думаю, это достаточно просто.
- person Alexis Wilke; 16.09.2014
Вы можете использовать JSON с комментариями в нем, если вы загрузите его как текстовый файл, а затем удалите комментарии.
Например, для этого вы можете использовать библиотеку декомпозиции. Ниже приведен полный пример.
Входной 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-decoment, grunt-decoment
Спецификация JSON не поддерживает комментарии в стиле // or /* */
.
Но некоторые библиотеки синтаксического анализа JSON и IDE их поддерживают.
Нравиться:
.jsonc
FTW ????
- person Quang Van; 13.01.2020
Я только что нашел «grunt-strip-json-comments».
«Удалите комментарии из JSON. Это позволяет вам использовать комментарии в ваших файлах JSON! »
{
// Rainbows
"unicorn": /* ❤ */ "cake"
}
Вздох. Почему бы просто не добавить поля, например
{
"note1" : "This demonstrates the provision of annotations within a JSON file",
"field1" : 12,
"field2" : "some text",
"note2" : "Add more annotations as necessary"
}
Просто убедитесь, что ваши имена "notex" не конфликтуют с настоящими полями.
Just make sure your "notex" names don't conflict with any real fields.
- это проблема. Это не произвольное решение.
- person William Entriken; 14.05.2014
{"/* ---- my section ----*/":0}
. Это действительный JSON, поскольку JSON принимает любой символ в ключевой строке. Он не будет конфликтовать с другими свойствами, и никого не волнует или его переупорядочивают. Тем не менее, 2 комментария не должны совпадать.
- person olivr; 08.04.2015
Есть хорошее решение (взлом), которое является допустимым JSON, но оно будет работать не во всех случаях (см. Комментарии ниже). Просто сделайте один и тот же ключ дважды (или больше). Например:
{
"param" : "This is the comment place",
"param" : "This is value place",
}
Итак, JSON будет понимать это как:
{
"param" : "This is value place",
}
Практический ответ для пользователей Visual Studio Code в 2019 году - использовать расширение jsonc.
Это практично, потому что это расширение, распознаваемое Visual Studio Code, для обозначения JSON с комментариями. Пожалуйста, дайте мне знать о других редакторах / IDE в комментариях ниже.
Было бы неплохо, если бы Visual Studio Code и другие редакторы также добавили встроенную поддержку JSON5, но на данный момент Visual Studio Code включает поддержку только для jsonc.
(Я просмотрел все ответы, прежде чем опубликовать это, и ни один не упомянул jsonc.)
jsonc
- это хорошо, но, к сожалению, вы ограничены // комментариями. Когда вам нужно что-то еще, вы тоже немного сломаны. stackoverflow.com/questions/58553633/
- person GhostCat; 25.10.2019
Нет, JSON не может иметь комментарии напрямую. Однако, как предлагает здесь, вы можете добиться аналогичного эффекта, сделав что-то нравиться
{
"//name": "Name comment here",
"name": "Jack",
"//age": "Age comment here",
"age": "25"
}
Большинство парсеров JSON игнорируют свойства, которые не отображаются.
Если ваш контекст - конфигурация Node.js, вы можете рассмотреть JavaScript через module.exports
в качестве альтернативы JSON:
module.exports = {
"key": "value",
// And with comments!
"key2": "value2"
};
Синтаксис require
останется прежним. Поскольку это JavaScript, расширение файла должно быть .js
.
Как уже отмечалось во многих ответах, JSON изначально не имеет комментариев. Конечно, иногда они все равно нужны. Для Python это можно сделать двумя способами: commentjson
(#
и //
для Только Python 2) или json_tricks
(#
или //
для Python 2 и Python 3), который имеет несколько других функций. . Отказ от ответственности: я сделал json_tricks
.
Вы можете использовать простую предварительную обработку с помощью регулярных выражений. Например, следующая функция будет декодировать закомментированный JSON в PHP:
function json_decode_commented ($data, $objectsAsArrays = false, $maxDepth = 512, $opts = 0) {
$data = preg_replace('~
(" (?:[^"\\\\] | \\\\\\\\ | \\\\")*+ ") | \# [^\v]*+ | // [^\v]*+ | /\* .*? \*/
~xs', '$1', $data);
return json_decode($data, $objectsAsArrays, $maxDepth, $opts);
}
Он поддерживает все комментарии в стиле PHP: / *, #, //. Строковые литералы сохраняются как есть.
Файлы * .json обычно используются как файлы конфигурации или статические данные, поэтому комментарии необходимы → некоторые редакторы, такие как NetBeans, принимают комментарии в * .json.
Проблема заключается в синтаксическом разборе содержимого объекта. Решение - всегда применять функцию очистки (сервер или клиент).
### PHP
$rgx_arr = ["/\/\/[^\n]*/sim", "/\/\*.*?\*\//sim", "/[\n\r\t]/sim"];
$valid_json_str = \preg_replace($rgx_arr, '', file_get_contents(path . 'a_file.json'));
### JavaScript
valid_json_str = json_str.replace(/\/\/[^\n]*/gim,'').replace(/\/\*.*?\*\//gim,'')
Если вы используете PHP, вы можете использовать эту функцию для поиска и удаления комментариев // / * типа из строки JSON перед ее синтаксическим анализом в объект / массив:
function json_clean_decode($json, $assoc = true, $depth = 512, $options = 0) {
// search and remove comments like /* */ and //
$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);
if(version_compare(phpversion(), '5.4.0', '>=')) {
$json = json_decode($json, $assoc, $depth, $options);
}
elseif(version_compare(phpversion(), '5.3.0', '>=')) {
$json = json_decode($json, $assoc, $depth);
}
else {
$json = json_decode($json, $assoc);
}
return $json;
}
Надеюсь это поможет!
Да, вы можете оставлять комментарии. Но я не буду рекомендовать какую-либо причину, упомянутую выше.
Я провел небольшое расследование и обнаружил, что все методы, требующие JSON, используют метод JSON.parse
. Итак, я пришел к решению: мы можем переопределить или выполнить исправление обезьяны вокруг JSON.parse.
Примечание: проверено только на Node.js ;-)
var oldParse = JSON.parse;
JSON.parse = parse;
function parse(json){
json = json.replace(/\/\*.+\*\//, function(comment){
console.log("comment:", comment);
return "";
});
return oldParse(json)
}
Файл JSON:
{
"test": 1
/* Hello, babe */
}
"what_if"
и значением "I happen to have /* slashes and asterisks */ in my data?"
, а не "I happen to have in my data"
.
- person DSimon; 22.12.2016
json.replace(/("\/\/.*"|"\/\*(?:.|\n)*?")|(\/\/.*|\/\*(?:.|\n)*?\*\/)/g, "$1")
regexr.com/3p39p
- person Maxim Paperno; 08.05.2018
Конечно, вы можете прокомментировать JSON. Чтобы прочитать закомментированный файл JSON из JavaScript, вы можете удалить комментарии перед его анализом (см. Код ниже). Я уверен, что этот код можно улучшить, но его легко понять тем, кто использует регулярные выражения.
Я использую файлы JSON с комментариями, чтобы указать формы нейронов для моих синтетических рефлекторных систем. Я также использую JSON с комментариями для хранения промежуточных состояний работающей нейронной системы. Комментарии очень удобны. Не слушайте наставников, которые говорят вам, что это плохая идея.
fetch(filename).then(function(response) {
return response.text();
}).then(function(commented) {
return commented.
replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1').
replace(/\r/,"\n").
replace(/\n[\n]+/,"\n");
}).then(function(clean) {
return JSON.parse(clean);
}).then(function(json) {
// Do what you want with the JSON object.
});
Вы можете использовать JSON-LD и схему schema.org comment, чтобы правильно писать комментарии:
{
"https://schema.org/comment": "this is a comment"
}
Весь этот поток предполагает, что добавление комментариев - единственное улучшение, которое необходимо внести в JSON. Если кому-то не нужны комментарии в JSON, потому что он будет использоваться для сериализации, просто опустите комментарии. То же самое и с пробелами. Но зачем останавливаться на достигнутом? Почему кавычки обязательны в JSON? Ничего полезного они не добавляют.
Единственная причина, по которой я могу придумать такой жесткий JSON, - это сложность синтаксического анализа. Но это не так. Практически любой программист может написать парсер JSON в любом направлении.
Я хочу, чтобы JSON был удобочитаемым и эффективным (кратким) и был полезен для передачи данных, файлов конфигурации и многого другого. Оба эти требования удовлетворяются в следующем примере:
{stringA: stringB, stringC: stringD, [stringE, stringF]}
Короче, чем любая существующая спецификация JSON, но столь же удобочитаема и более эффективна.
Необходимо включить кавычки, апострофы, запятые или квадратные скобки в свойство или значение? Просто заключите их в вопросительные знаки или апострофы (с экранированием обратной косой черты), как в JavaScript.
Но, пожалуйста, сделайте кавычки необязательными. Почему? Поскольку JSON не может содержать имена переменных или функций (во избежание атак путем инъекций), кавычки не позволяют устранить неоднозначность. Мы уже знаем, что все данные представляют собой строки. Поэтому, пожалуйста, опускайте кавычки, если они действительно не нужны.
Комментарии необходимы в JSON, а комментарии доступны как минимум в .NET Core JSON и Newtonsoft Json. Прекрасно работает.
{
// this is a comment for those who is ok with being different
"regular-json": "stuff"...
}
JSON не поддерживает комментарии, но YAML поддерживает встроенные комментарии (но без блочных комментариев). Поскольку они оба являются файлами данных и имеют схожие функции, это может быть подходящим вариантом. Кроме того, в Интернете есть ресурсы, например json2yaml.com, которые могут легко преобразовать JSON в YAML.
Есть и другие библиотеки, совместимые с JSON, которые поддерживают комментарии.
Ярким примером является "Hashcorp Language" (HCL) ". Он написан теми же людьми, которые сделал Бродягу, упаковщик, консул и хранилище.
Я столкнулся с этой проблемой в своем текущем проекте, так как у меня довольно много JSON, который требует некоторых комментариев, чтобы все было легко запомнить.
Я использовал эту простую функцию Python для замены комментариев и использовал json.loads
, чтобы преобразовать ее в dict
:
import json, re
def parse_json(data_string):
result = []
for line in data_string.split("\n"):
line = line.strip()
if len(line) < 1 or line[0:2] == "//":
continue
if line[-1] not in "\,\"\'":
line = re.sub("\/\/.*?$", "", line)
result.append(line)
return json.loads("\n".join(result))
print(parse_json("""
{
// This is a comment
"name": "value" // so is this
// "name": "value"
// the above line gets removed
}
"""))
да. Вы можете помещать комментарии в файл JSON.
{
"": "Location to post to",
"postUrl": "https://example.com/upload/",
"": "Username for basic auth",
"username": "joebloggs",
"": "Password for basic auth (note this is in clear, be sure to use HTTPS!",
"password": "bloejoggs"
}
Комментарий - это просто кусок текста, описывающий назначение блока кода или конфигурации. И поскольку вы можете указывать ключи в JSON несколько раз, вы можете сделать это следующим образом. Это синтаксически правильно, и единственный компромисс - у вас будет пустой ключ с каким-то мусорным значением в вашем словаре (который вы можете обрезать ...)
Я видел этот вопрос много лет назад, но я только что видел, как это делается в проекте, над которым я работаю, и я подумал, что это действительно чистый способ сделать это. Наслаждаться!
Мне очень нравится подход @eli, есть более 30 ответов, но никто не упомянул списки (массив). Итак, используя подход @eli, мы могли бы сделать что-то вроде:
"part_of_speech": {
"__comment": [
"@param {String} type - the following types can be used: ",
"NOUN, VERB, ADVERB, ADJECTIVE, PRONOUN, PREPOSITION",
"CONJUNCTION, INTERJECTION, NUMERAL, PARTICLE, PHRASE",
"@param {String} type_free_form - is optional, can be empty string",
"@param {String} description - is optional, can be empty string",
"@param {String} source - is optional, can be empty string"
],
"type": "NOUN",
"type_free_form": "noun",
"description": "",
"source": "https://google.com",
"noun_class": {
"__comment": [
"@param {String} noun_class - the following types can be used: ",
"1_class, 2_class, 3_class, 4_class, 5_class, 6_class"
],
"noun_class": "4_class"
}
}
JSON не имеет комментариев. Кодировщик JSON НЕ ДОЛЖЕН выводить комментарии. Декодер JSON МОЖЕТ принимать и игнорировать комментарии.
Утилита jq включает декодер, который позволяет # - комментарии стиля, и поэтому jq является одним из нескольких инструментов, которые можно использовать вместе с файлами JSON с комментариями, если такие файлы обрабатываются как программы jq, а не как файлы JSON. Например:
$ jq -ncf <(echo $'[1, # one\n2 ] # two')
[1,2]
Что еще более важно, jq может обрабатывать очень большие файлы JSON с комментариями как программы; это можно проиллюстрировать с помощью известного файла JSON:
$ ls -l JEOPARDY_QUESTIONS1.json
-rw-r--r-- 2 xyzzy staff 55554625 May 12 2016 JEOPARDY_QUESTIONS1.json
$ jq -nf JEOPARDY_QUESTIONS1.json | jq length
216930
Технически нет. Но вы можете решить эту проблему следующим образом.
{
"json": "actual data goes here, comments below",
"comment1": "Lorem ipsum dolor sit amet",
"comment2": "consectetur adipiscing elit"
}
Просто вставьте комментарии в данные. Если вы пронумеруете их, чтобы сделать каждый ключевой путь уникальным, у вас не должно возникнуть проблем.
Да, вы можете, но ваш синтаксический анализ, вероятно, не удастся (стандарта нет).
Чтобы разобрать его, вы должны удалить эти комментарии вручную или с помощью регулярного выражения:
Он заменяет любые комментарии, например:
/****
* Hey
*/
/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/
Он заменяет любые комментарии, например:
// Hey
/\/\/.*/
В JavaScript вы можете сделать что-то вроде этого:
jsonString = jsonString.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/, "").replace(/\/\/.*/,"")
var object = JSON.parse(jsonString);
/*hey*/
, даже из внутренних строк.
- person 6502; 03.08.2014
"\"/*foo*/\"
, например. Как уже указывалось ранее, использование регулярного выражения - действительно плохая идея.
- person meagar; 02.06.2020
//comments
для конкретного варианта использования файла конфигурации Sublime Text, ответ - да (начиная с версии 2). Sublime Text не будет жаловаться на это, по крайней мере, тогда как он будет жаловаться на{"__comment": ...}
в консоли, потому что это неожиданное поле. - person driftcatcher   schedule 01.02.2013jsonc
файлы должны работать, отсюда и определение: JSON с элементами C. - person mekb   schedule 21.07.2019JSON
широко поддерживается несколькими организациями по стандартизации, как можно увидеть в его статье в википедии.JSON5
- один из многих нестандартных парсеров;5
, похоже, является попыткой извлечь выгоду из популярностиHTML5
. ИМХО, несмотря на возможно похвальные цели автора (ов), это имя вводит в заблуждение, поэтому неприемлемо. - person ToolmakerSteve   schedule 01.05.2020// comments
. На всякий случай, если кто-то придет сюда по этому особому случаю, как я делал это раньше. - person stackprotector   schedule 17.09.2020