Поиск по сайту:

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


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

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

Основы JSON

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

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

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

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

{
    "id": 1001,
    "title": "What is JSON?",
    "author": {
        "id": 1,
        "name": "James Walker"
    },
    "tags": ["api", "json", "programming"],
    "published": false,
    "publishedTimestamp": null
}

В этом примере демонстрируются все типы данных 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, инкапсулируют все в объект верхнего уровня:

{
    "error": 1000
}

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

1000
true
null

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

Работа с JSON

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

JavaScript

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

const post = {
    id: 1001,
    title: "What Is JSON?",
    author: {
        id: 1,
        name: "James Walker"
    }
};
 
const encodedJson = JSON.stringify(post);
 
// {"id": 1001, "title": "What Is JSON?", ...}
console.log(encodedJson);
 
const decodedJson = JSON.parse(encodedJson);
 
// James Walker
console.log(decodedJson.author.name);

PHP

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

$post = [
    "id" => 1001,
    "title" => "What Is JSON?",
    "author" => [
        "id" => 1,
        "name" => "James Walker"
    ]
];
 
$encodedJson = json_encode($post);
 
// {"id": 1001, "title": "What Is JSON?", ...}
echo $encodedJson;
 
$decodedJson = json_decode($encodedJson, true);
 
// James Walker
echo $decodedJson["author"]["name"];

питон

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

import json
 
post = {
    "id": 1001,
    "title": "What Is JSON?",
    "author": {
        "id": 1,
        "name": "James Walker"
    }
}
 
encodedJson = json.dumps(post)
 
# {"id": 1001, "title": "What Is JSON?", ...}
print(encodedJson)
 
decodedJson = json.loads(encodedJson)
 
# James Walker
print(decodedJson["author"]["name"])

Рубин

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

require "json"
 
post = {
    "id" => 1001,
    "title" => "What Is JSON?",
    "author" => {
        "id" => 1,
        "name" => "James Walker"
    }
}
 
encodedJson = JSON.generate(post)
 
# {"id": 1001, "title": "What Is JSON?", ...}
puts encodedJson
 
decodedJson = JSON.parse(encodedJson)
 
# James Walker
puts decodedJson["author"]["name"]

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

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

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

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

Нет схем

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

Нет ссылок

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

{
    "posts": [
        {
            "id": 1001,
            "title": "What is JSON?",
            "author": {
                "id": 1,
                "name": "James Walker"
            }
        },
        {
            "id": 1002,
            "title": "What is SaaS?",
            "author": {
                "id": 1,
                "name": "James Walker"
            }
        }
    ]
}

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

{
    "posts": [
        {
            "id": 1001,
            "title": "What is JSON?",
            "author": "{{ .authors.james }}"
        },
        {
            "id": 1002,
            "title": "What is SaaS?",
            "author": "{{ .authors.james }}"
        }
    ],
    "authors": {
        "james": {
            "id": 1,
            "name": "James Walker"
        }
    }
}

В настоящее время это невозможно со стандартным 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 остается претендентом для приложений, которые хотят определять схему данных и не боятся многословия.




Все права защищены. © Linux-Console.net • 2019-2024