Как сделать комментарий в json

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

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

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

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

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

У вас может быть выделенный элемент данных, называемый "_comment" (или что-то еще), который будет игнорироваться приложениями, использующими данные JSON.

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

Но если вы решили:

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

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

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

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

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

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

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

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

Это интересное любопытство, но вы действительно не должны использовать его для чего-либо вообще. Ниже приведен оригинальный ответ.

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

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

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

Вышеприведенный код действительный JSON. Если вы проанализируете его, вы получите такой объект:

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

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

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

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

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

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

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

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

Комментарии не являются официальным стандартом. Хотя некоторые парсеры поддерживают комментарии в стиле C. Я использую JsonCpp. В примерах есть это:

Jsonlint не подтверждает это. Таким образом, комментарии являются специфическим расширением парсера и не являются стандартными.

Еще одна альтернатива - jsonc.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вы перейдете по ссылке, вы увидите

Поскольку у меня был аналогичный файл в локальной папке, проблем с политикой Same-origin не было, поэтому я решил использовать чистый JSON. и, конечно, $.getJSON молча $.getJSON неудачу из-за комментариев.

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

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

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

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

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

Сначала канонизируйте свой JSON, уменьшив его:

Затем закодируйте свой комментарий в двоичном формате:

Затем сверните свой двоичный файл:

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

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

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

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

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

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

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

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

Естественно, такая строка должна включать в себя все важные свойства.

Мы могли бы реализовать преобразование следующим образом:

…Но в процессе разработки добавляются новые свойства, старые свойства переименовываются и удаляются. Обновление такого toString каждый раз может стать проблемой. Мы могли бы попытаться перебрать свойства в нём, но что, если объект сложный, и в его свойствах имеются вложенные объекты? Мы должны были бы осуществить их преобразование тоже.

К счастью, нет необходимости писать код для обработки всего этого. У задачи есть простое решение.

JSON.stringify

JSON (JavaScript Object Notation) – это общий формат для представления значений и объектов. Его описание задокументировано в стандарте RFC 4627. Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java или любом другом языке.

JavaScript предоставляет методы:

  • JSON.stringify для преобразования объектов в JSON.
  • JSON.parse для преобразования JSON обратно в объект.

Например, здесь мы преобразуем через JSON.stringify данные студента:

Метод JSON.stringify(student) берёт объект и преобразует его в строку.

Обратите внимание, что объект в формате JSON имеет несколько важных отличий от объектного литерала:

  • Строки используют двойные кавычки. Никаких одинарных кавычек или обратных кавычек в JSON. Так 'John' становится "John" .
  • Имена свойств объекта также заключаются в двойные кавычки. Это обязательно. Так age:30 становится "age":30 .

JSON.stringify может быть применён и к примитивам.

JSON поддерживает следующие типы данных:

  • Объекты
  • Массивы [ . ]
  • Примитивы:
    • строки,
    • числа,
    • логические значения true/false ,
    • null .

    JSON является независимой от языка спецификацией для данных, поэтому JSON.stringify пропускает некоторые специфические свойства объектов JavaScript.

    • Свойства-функции (методы).
    • Символьные свойства.
    • Свойства, содержащие undefined .

    Обычно это нормально. Если это не то, чего мы хотим, то скоро мы увидим, как можно настроить этот процесс.

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

    Важное ограничение: не должно быть циклических ссылок.

    Здесь преобразование завершается неудачно из-за циклической ссылки: room.occupiedBy ссылается на meetup , и meetup.place ссылается на room :

    Исключаем и преобразуем: replacer

    Полный синтаксис JSON.stringify :

    value Значение для кодирования. replacer Массив свойств для кодирования или функция соответствия function(key, value) . space Дополнительное пространство (отступы), используемое для форматирования.

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

    Если мы передадим ему массив свойств, будут закодированы только эти свойства.

    Здесь мы, наверное, слишком строги. Список свойств применяется ко всей структуре объекта. Так что внутри participants – пустые объекты, потому что name нет в списке.

    Давайте включим в список все свойства, кроме room.occupiedBy , из-за которого появляется цикличная ссылка:

    Теперь всё, кроме occupiedBy , сериализовано. Но список свойств довольно длинный.

    К счастью, в качестве replacer мы можем использовать функцию, а не массив.

    Функция будет вызываться для каждой пары (key, value) , и она должна возвращать заменённое значение, которое будет использоваться вместо исходного. Или undefined , чтобы пропустить значение.

    Обратите внимание, что функция replacer получает каждую пару ключ/значение, включая вложенные объекты и элементы массива. И она применяется рекурсивно. Значение this внутри replacer – это объект, который содержит текущее свойство.

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

    Форматирование: space

    Третий аргумент в JSON.stringify(value, replacer, space) – это количество пробелов, используемых для удобного форматирования.

    Ниже space = 2 указывает JavaScript отображать вложенные объекты в несколько строк с отступом в 2 пробела внутри объекта:

    Параметр space применяется для логирования и красивого вывода.

    Как и toString для преобразования строк, объект может предоставлять метод toJSON для преобразования в JSON. JSON.stringify автоматически вызывает его, если он есть.

    Как видим, date (1) стал строкой. Это потому, что все объекты типа Date имеют встроенный метод toJSON , который возвращает такую строку.

    Теперь давайте добавим собственную реализацию метода toJSON в наш объект room (2) :

    Как видите, toJSON используется как при прямом вызове JSON.stringify(room) , так и когда room вложен в другой сериализуемый объект.

    JSON.parse

    Чтобы декодировать JSON-строку, нам нужен другой метод с именем JSON.parse.

    str JSON для преобразования в объект. reviver Необязательная функция, которая будет вызываться для каждой пары (ключ, значение) и может преобразовывать значение.

    Или для вложенных объектов:

    JSON может быть настолько сложным, насколько это необходимо, объекты и массивы могут включать другие объекты и массивы. Но они должны быть в том же JSON-формате.

    Вот типичные ошибки в написанном от руки JSON (иногда приходится писать его для отладки):

    Кроме того, JSON не поддерживает комментарии. Добавление комментария в JSON делает его недействительным.

    Существует ещё один формат JSON5, который поддерживает ключи без кавычек, комментарии и т.д. Но это самостоятельная библиотека, а не спецификация языка.

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

    Использование reviver

    Представьте, что мы получили объект meetup с сервера в виде строки данных.

    …А теперь нам нужно десериализовать её, т.е. снова превратить в объект JavaScript.

    Давайте сделаем это, вызвав JSON.parse :

    Значением meetup.date является строка, а не Date объект. Как JSON.parse мог знать, что он должен был преобразовать эту строку в Date ?

    Кстати, это работает и для вложенных объектов:

    Итого

    • JSON – это формат данных, который имеет собственный независимый стандарт и библиотеки для большинства языков программирования.
    • JSON поддерживает простые объекты, массивы, строки, числа, логические значения и null .
    • JavaScript предоставляет методы JSON.stringify для сериализации в JSON и JSON.parse для чтения из JSON.
    • Оба метода поддерживают функции преобразования для интеллектуального чтения/записи.
    • Если объект имеет метод toJSON , то он вызывается через JSON.stringify .

    Задачи

    Преобразуйте объект в JSON, а затем обратно в обычный объект

    Преобразуйте user в JSON, затем прочитайте этот JSON в другую переменную.

    Плохо не знать теории. Взялся за работу с JSON . Передаются на клиент данные в виде JSON, на клиенте шаблонизируем с помощью handlebars, всё красиво вроде. Тестовый объект с данными был написан в теле HTML страницы. Всё работало.
    Перенёс код копипастом в отдельный файл .json, стучусь к нему аяксом, запрос проходит, но ничего не происходит. Смотрю в ответ, а там parsererror. Ничего не понимаю. Удаляю всё, создаю простенький тестовый json-файл.

    Всё работает.
    А вся разница между тестовым и рабочим JSON’ом, что в в тестовом нет комментариев. В рабочем я закомментировал лишнее. Стоило убрать комментарии и всё заработало. Буду знать.

    Комментарии в JSON: 4 комментария

    а я больше веб-инспектором в хроме, там тоже много вкусного :)

    Хм, в самом деле, нужны кавычки. Позор-то какой :(

    Добавить комментарий Отменить ответ

    Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

    История о том, почему мы не должны использовать инструменты для того, что можно сделать с помощью простого JavaScript.

    Jul 20, 2020 · 4 min read


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

    Когда-то давным-давно я настраивал сложный монорепорепозитор и й. Он содержал несколько пакетов, а они содержали общую конфигурацию транспиляции, линтинга и тестирования. Некоторые из этих пакетов нуждались в небольшой настройке конфигурации. Я твердо верю, что меньше — это больше, поэтому использовал конфигурацию JSON внутри package.json . Общая конфигурация жила в пакете, другие пакеты использовали его через механизм расширения, предоставленный инструментом, на который мы нацеливались — Babylon:

    Так просто. К сожалению, не всякий инструмент реализует этот механизм “расширения”.

    Полагая, что соответствующих инструментов не было, я искал связанные проблемы и вопросы на Github. И я не был единственным, кто просил о поддержке механизма расширения. После дружеских споров я понял, что сопровождающие пакет люди никогда не будут рассматривать эту просьбу. Зачем им это делать, если они уже реализовали подходящий механизм расширения: конфигурационные файлы на чистом JavaScript.

    О боже! Я был так неправ… и они были так правы. Я был пьян обещаниями мощного package.json со всеми моими конфигурациями и совершенно упустил суть. Учитывая моё знание Ruby, я также должен был знать, что инструмент определения пакетов gemfile.rb всегда был гибче, чем package.json .

    Как только я воспользовался форматом чистого JavaScript, все мои проблемы исчезли. Монорепозиторий был красив и время от времени подвергался рефакторингу ради простоты и эффективности.

    В основном потому, что JSON — это формат данных, а JavaScript — это просто код. Код поддаётся оценке (следовательно, динамический) и компонуемый. Нет необходимости в каком-то инструменте, чтобы делать что-то сверх JSON.

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

    Переопределяемость

    Если вам “требуется” ( require ) файл конфигурации, вы можете изменить возвращаемый объект и повторно экспортировать его. Пакету нужен дополнительный плагин Babel? Без проблем:

    Динамическое конфигурирование

    Как я уже сказал, JSON — это формат данных, поэтому он не может быть динамическим. Если вам нужны разные версии конфигурации JSON, придётся использовать разные файлы, которые могут отличаться лишь незначительно. Применяйте JavaScript. Когда инструменту требуется файл конфигурации JavaScript, код вычисляет нужные значения. Плагин нужен только в производственном коде? Без проблем:

    Совместное использование

    Есть канонический способ совместного использования кода в JavaScript: пакет npm . Напишите соответствующий package.json и опубликуйте его:

    После публикации вы просто "требуете" пакет в каждом проекте, где он вам нужен:

    Комментируемость

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

    JavaScript имеет реальные комментарии. Вы можете поместить их, куда хотите, и они удобны подсветкой синтаксиса.

    Тестируемость

    Как я уже говорил, можно тестировать конфигурационные файлы. Это всего лишь код. Вы сами решаете, добавляет ли тестирование вашей инструментальной инфраструктуры ценность проекту. Предположим, так оно и есть. Давайте протестируем динамическую конфигурацию с помощью Jest:

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

    Ошибиться в отношении конфигурационных файлов JavaScript было одной из лучших вещей (с технической точки зрения), произошедших со мной. Это сделало мою жизнь как разработчика проще. В этой истории я показал несколько примеров того, что можно сделать с помощью конфигурации JavaScript. Это те вещи, которые нелегко осуществить с помощью JSON без дополнительных инструментов. Кажется очевидным? Но я не знаю, почему большинство инструментов JS всё еще поддерживают конфигурацию через JSON. Я понимаю важность обратной совместимости и не призываю ломать весь интернет, но, возможно, пришло время начать выдавать предупреждения об устаревании и постепенно отказываться от JSON.

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

    JSON (JavaScript Object Notation) – это текстовый формат представления данных в нотации объекта JavaScript. Предназначен JSON, также как и некоторые другие форматы такие как XML и YAML, для обмена данными.

    JavaScript – Что такое JSON

    Несмотря на своё название, JSON можно использовать не только в JavaScript, но и в любом другом языке программирования.

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

    При веб-разработке JSON очень часто применяется в качестве формата для передачи информации от веб-сервера клиенту (веб-браузеру) при AJAX запросе.

    Как выглядит этот процесс? Его можно представить в виде двух шагов. На первом шаге, сервер, по запросу пришедшему ему от клиента, сначала формирует некоторый набор данных в удобном формате, который затем можно было бы очень просто упаковать в строку JSON. Завершается работа на сервере отправкой JSON данных в качестве результата клиенту. На втором шаге, клиент получает в качестве ответа от сервера строку JSON и распаковывает её, т.е. переводит в JavaScript объект. После этого на клиенте выполняются дальнейшие с ними действия, например, выводятся на страницу.

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

    В JSON, в отличие от XML и YAML, данные организованы также как в объекте JavaScript. Но JSON – это не объект, а строка. При этом не любой объект JavaScript может быть переведён один к одному в JSON. Например, если у объекта есть методы, то они при преобразовании в строку JSON будут проигнорированы и не включены в неё.

    Структура формата JSON

    Структура строки JSON практически ничем не отличается от записи JavaScript объекта.

    Она состоит из набора пар ключ-значения . В этой паре ключ отделяется от значения с помощью знака двоеточия ( : ), а одна пара от другой - с помощью запятой ( , ). При этом ключ в JSON, в отличие от объекта обязательно должен быть заключен в двойные кавычки . Это первое отличие JSON от JavaScript объекта. В объекте ключ (имя свойства) не обязательно следует заключать в двойные кавычки.

    Чтобы не усложнять доступ к данным, при задании ключам имён лучше придерживаться тех же правил, что и при именовании переменных.

    Второе отличие заключается в том, что значение ключа в JSON можно задать только в одном из следующих форматов: string (строкой), number (числом), object (объектом), array (массивом), boolean (логическим значением true или false ) или null (специальным значением JavaScript). Например, значение ключа в JSON не может быть функцией или датой (объектом типа Date ).

    Пример JSON строки, состоящей из различных типов данных:

    При этом стоит обратить внимание на то, что JSON не допускает использование внутри своей структуры комментариев.

    Работа с JSON в JavaScript

    Как было уже отмечено выше, JSON – это строка.

    Работа с JSON в JavaScript обычно осуществляется в двух направлениях:

    • перевод строки JSON в объект (данный процесс ещё называют парсингом);
    • конвертирование объекта в строку JSON (другими словами действие обратное парсингу).

    Парсинг JSON

    Парсинг JSON (перевод строки JSON в объект JavaScript) осуществляется с помощью метода eval или parse .

    Пример использования eval для парсинга JSON:

    Метод eval не рекомендуется использовать так как он не безопасен. Так если кто-то сможет добавить скрипт в строку JSON, то он выполнится.

    В JavaScript для парсинга строки в JSON рекомендуется использовать метод JSON.parse . Он такой уязвимости не имеет.

    Использование метода JSON.parse :

    Конвертирование объекта JavaScript в строку JSON

    Перевод объекта JavaScript в строку JSON осуществляется с помощью метода JSON.stringify . Данный метод осуществляет действие обратное методу JSON.parse .

    Преимущества формата JSON

    Формат представления данных JSON имеет следующие преимущества:

    • удобные и быстрые в работе методы, предназначенные для конвертации (парсинга) строки JSON в объект JavaScript и обратно;
    • понятная и простая структура данных;
    • очень маленький размер по сравнению с другими форматами данных (например XML). Это связано с тем, что формат JSON содержит минимальное возможное форматирование, т.е. при его написании используется всего несколько специальных знаков. Это очень важное преимущество, т.к. данные представленные в формате JSON будут быстрее загружаться, чем, если бы они были бы представлены в других форматах.

    Из-за того что данный формат имеет очень много преимуществ он стал применяться не только в JavaScript, но и во многих других языках, таких как C, Ruby, Perl, Python, PHP и т.д.

    Сравнение форматов JSON и XML

    Формат JSON имеет следующие преимущества перед форматом XML:

    1. При передаче некоторых данных размер JSON будет значительно меньше, чем размер XML.
    2. JSON имеет более удобные методы конвертации в структуры данных JavaScript, чем XML.
    3. JSON более просто создавать, чем XML.

    Работа с данными JSON после парсинга

    Работа с данными JSON после парсинга осуществляется как с объектом JavaScript.

    Читайте также: