Что такое JSON и как его использовать?

Опубликовано: 2022-08-14
Изображение текста «JSON», наложенное на монитор компьютера
Мария Вонотна/Shutterstock.com

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

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

Основы JSON

Первоначально JSON был разработан Дугласом Крокфордом как формат без сохранения состояния для передачи данных между браузерами и серверами. Еще в начале 2000-х веб-сайты начали асинхронно получать дополнительные данные со своего сервера после начальной загрузки страницы. Как текстовый формат, основанный на JavaScript, JSON упростил получение и использование данных в этих приложениях. В конечном итоге спецификация была стандартизирована как ECMA-404 в 2013 году.

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

Простой пример JSON

Это JSON-представление сообщения в блоге:

 {
    "идентификатор": 1001,
    "title": "Что такое JSON?",
    "автор": {
        "идентификатор": 1,
        "name": "Джеймс Уокер"
    },
    "метки": ["api", "json", "программирование"],
    "опубликовано": ложь,
    "publishedTimestamp": ноль
}

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

Типы данных JSON

Шесть типов данных могут быть изначально представлены в JSON:

  • Строки — строки заключаются в двойные кавычки; символы могут быть экранированы с помощью обратной косой черты.
  • Числа – числа записываются в виде цифр без кавычек. Вы можете включить дробный компонент для обозначения числа с плавающей запятой. Большинство реализаций синтаксического анализа JSON предполагают целое число, когда десятичная точка отсутствует.
  • Булевы значения — поддерживаются литеральные значения true и false .
  • Null — литеральное значение null может использоваться для обозначения пустого или пропущенного значения.
  • Массивы . Массив представляет собой простой список, заключенный в квадратные скобки. Каждый элемент в списке отделяется запятой. Массивы могут содержать любое количество элементов и могут использовать все поддерживаемые типы данных.
  • Объекты — объекты создаются фигурными скобками. Это набор пар ключ-значение, где ключи представляют собой строки, заключенные в двойные кавычки. Каждый ключ имеет значение, которое может принимать любой из доступных типов данных. Вы можете вкладывать объекты для создания каскадных иерархий. За каждым значением должна следовать запятая, означающая конец этой пары ключ-значение.

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

Семантика и проверка

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

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

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

Обозначение содержимого JSON

Расширение .json обычно используется при сохранении JSON в файл. Содержимое JSON имеет стандартизированный тип MIME application/json , хотя text/json иногда используется из соображений совместимости. В настоящее время вы должны полагаться на application/json для HTTP-заголовков Accept и Content-Type .

Большинство API, использующих JSON, инкапсулируют все в объект верхнего уровня:

 {
    "ошибка": 1000
}

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

 1000 
 истинный 
 нулевой

Они будут декодированы в соответствующие скаляры на вашем языке программирования.

Работа с JSON

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

JavaScript

В JavaScript JSON.stringify() и JSON.parse() используются для кодирования и декодирования строк JSON:

 постоянный пост = {
    идентификатор : 1001 ,
    title : "Что такое JSON?" ,
    автор : {
        идентификатор : 1 ,
        Имя : "Джеймс Уокер"
    }
} ;

константный кодированныйJson = JSON. упорядочить ( отправить ) ;

// {"id": 1001, "title": "Что такое JSON?", ...}
приставка. журнал ( закодированныйJson ) ;

константа decodedJson = JSON. синтаксический анализ ( закодированный Json ) ;

// Джеймс Уокер
приставка. log ( decodedJson.автор.имя ) ; _

PHP

Эквивалентными функциями в PHP являются json_encode() и json_decode() :

 $ сообщение = [
    "идентификатор" => 1001 ,
    "title" => "Что такое JSON?" ,
    "автор" => [
        "идентификатор" => 1 ,
        "имя" => "Джеймс Уокер"
    ]
] ;

$encodedJson = json_encode ( $post ) ;

// {"id": 1001, "title": "Что такое JSON?", ...}
эхо $encodedJson ;

$decodedJson = json_decode ( $encodedJson , true ) ;

// Джеймс Уокер
echo $decodedJson [ "автор" ] [ "имя" ] ;

Питон

Python предоставляет json.dumps() и json.loads() для сериализации и десериализации соответственно:

 импортировать json

сообщение = {
    "идентификатор" : 1001 ,
    "title" : "Что такое JSON?" ,
    "автор" : {
        "идентификатор" : 1 ,
        "имя" : "Джеймс Уокер"
    }
}

закодированныйJson = json. свалки ( пост )

# {"id": 1001, "title": "Что такое JSON?", ...}
печать ( закодированный Json )

декодированный Json = json. загружает ( encodedJson )

# Джеймс Уокер
print ( decodedJson [ "автор" ] [ "имя" ] )

Рубин

Ruby предлагает JSON.generate и JSON.parse :

 требуется "json"

сообщение = {
    "идентификатор" => 1001 ,
    "title" => "Что такое JSON?" ,
    "автор" => {
        "идентификатор" => 1 ,
        "имя" => "Джеймс Уокер"
    }
}

закодированныйJson = JSON. генерировать ( опубликовать )

# {"id": 1001, "title": "Что такое JSON?", ...}
помещает encodedJson

декодированный JSON = JSON. синтаксический анализ ( закодированныйJson )

# Джеймс Уокер
помещает decodedJson [ "автор" ] [ "имя" ]

Ограничения JSON

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

Без комментариев

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

Нет схем

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

Нет ссылок

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

 {
    "сообщения": [
        {
            "идентификатор": 1001,
            "title": "Что такое JSON?",
            "автор": {
                "идентификатор": 1,
                "name": "Джеймс Уокер"
            }
        },
        {
            "идентификатор": 1002,
            "title": "Что такое SaaS?",
            "автор": {
                "идентификатор": 1,
                "name": "Джеймс Уокер"
            }
        }
    ]
}

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

 {
    "сообщения": [
        {
            "идентификатор": 1001,
            "title": "Что такое JSON?",
            "автор": "{{ .authors.james }}"
        },
        {
            "идентификатор": 1002,
            "title": "Что такое SaaS?",
            "автор": "{{ .authors.james }}"
        }
    ],
    "авторы": {
        "Джеймс": {
            "идентификатор": 1,
            "name": "Джеймс Уокер"
        }
    }
}

В настоящее время это невозможно со стандартным JSON.

Нет расширенных типов данных

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

Это вызывает неудобные несоответствия и крайние случаи. Если ваше приложение обрабатывает метки времени в виде строк, например 2022-07-01T12:00:00+00:00 , но внешний API представляет время в секундах после эпохи Unix — 1657287000 — вам нужно помнить, когда использовать каждый из форматы.

Альтернативы JSON

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

YAML получил широкое распространение в файлах конфигурации, а также в инструментах DevOps, IaC и средствах наблюдения. Он реже используется в качестве формата обмена данными для API. Относительная сложность YAML означает, что он менее доступен для новичков. Небольшие синтаксические ошибки могут вызвать запутанные ошибки синтаксического анализа.

Буферы протоколов (protobufs) — еще один новый претендент на JSON, предназначенный для сериализации структурированных данных. Protobufs имеют объявления типов данных, обязательные поля и поддержку большинства основных языков программирования. Система набирает популярность как более эффективный способ передачи данных по сетям.

Резюме

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

Хотя простота JSON является частью его популярности, она также накладывает ограничения на то, чего можно достичь с помощью этого формата. Отсутствие поддержки схем, комментариев, ссылок на объекты и пользовательских типов данных означает, что некоторые приложения обнаружат, что они перерастают возможности JSON. Более молодые альтернативы, такие как YAML и Protobuf, помогли решить эти проблемы, в то время как XML остается претендентом для приложений, которые хотят определять схему данных и не боятся многословия.