JSON или JavaScript Object Notation — текстовый формат обмена данными, основанный на JavaScript. Но при этом он может использоваться в любом языке программирования. Формат был разработан Дугласом Крокфордом.
JSON используется в REST API. Также в качестве альтернативы можно использовать XML, но разработчики больше предпочитают именно JSON, так как он более читабельный и меньше весит.
Как устроен JSON
В качестве значений в JSON могут быть использоваться:
- числа;
- строки;
- массивы;
- JSON-объекты;
- литералы (логические значения true, false и null).
С простыми значениями не возникнет никаких трудностей. Разберём массивы и JSON-объекты, ведь, по сути, придётся работать именно с ними.
JSON-объект
JSON-объект — это неупорядоченное множество пар «ключ:значение», заключённых в фигурные скобки { } и взаимодействие с ним проходит, как со словарем.
Ключ — это название параметра (свойства), который мы передаём серверу. Он служит маркером для принимающей запрос системы, чтобы она поняла, что мы ей отправили.
Давайте рассмотрим простой пример:
{
"name": "John",
"age": 26
}
Мы передали значение "John" с ключом "name", чтобы получить это свойство, нужно обратиться по его ключу, без которого сделать это было бы невозможно.
Значение может быть не только строкой или числом. Это может быть и другой объект! Или массив, или объект в массиве, массив в объекте… Абсолютно любое количество уровней вложенности!
Если мы говорим о параметрах, то в кавычки помещаются только строки, все остальное — нет.
Переносы строк делать необязательно. Вообще пробелы и переносы нужны только человеку для читабельности, система поймёт и без них.
Например, мы можем записать JSON-объект таким образом, и это тоже будет правильно:
{"name": "John","age": 26}
Ключ — ВСЕГДА строка, и мы в любом случае берём его в кавычки.
Ключи могут быть записаны в любом порядке, ведь, JSON-объект — это неупорядоченное множество пар «ключ:значение».
Если я хочу обратиться к "name", как мне это сказать? В Python есть два варианта это сделать:
- Получить значение с помощью метода get().
- Получить значение по ключу.
get() vs dict[key]
Разница между этими вариантами заключается в том, что если вы обратитесь к ключу, которого нет, то получите ошибку KeyError.
person = {
"name": "John",
"age": 26
}
print(person[“last_name”])
>>> KeyError Traceback (most recent call last)
>>> KeyError: 'last_name'
Но если воспользуетесь методом get(), то получите пустое значение:
last_name = person.get("last_name")
print(type("last_name"))
>>> NoneType
Также у этого метода есть второй передаваемый аргумент, который будет предаваться если ключа нет:
last_name = person.get("last_name", "There is no last_name")
print(last_name)
>>> 'There is no last_name'
JSON-массив
Массив заключен в квадратные скобки [ ].
["MALE", "FEMALE"]
Внутри квадратных скобок идет набор значений, разделённых запятыми. Здесь нет ключей, как в объекте, поэтому обращаться к массиву можно только по номеру элемента. И поэтому в случае массива менять местами данные внутри нельзя. Это упорядоченное множество значений, так что порядок важен.
Значения
Внутри массива могут быть любые значения:
- Цифры;
[1, 5, 10, 33]
- Строки;
["MALE", "FEMALE"]
- Литералы;
[true, false]
- Массивы;
["MALE", "FEMALE", [1, 5, 10, 33]]
- Объекты;
[1, {a:1, b:2}, "John"]
- Смесь.
[1, "John", true, [1, 5, 10, 33], {"a": 1, "b": 2}]
Well Formed JSON
JSON должен быть well formed, то есть синтаксически правильный.
Правила well formed JSON:
- Данные написаны в виде пар «ключ:значение»
- Данные разделены запятыми
- Объект находится внутри фигурных скобок { }
- Массив — внутри квадратных [ ]
Чтобы проверить JSON на синтаксис, можно использовать любой JSON Validator. Я использую JSON Formatter, он не только проверяет корректность синтаксиса, но и форматирует JSON в читабельный визуальный формат!
Из этого:
{"name": "John", "age": 26, "is_married": false, "children": { "name": "Julia", "age": null},"skills": ["Python", "Git", "Django", "Linux"]}
Он сделает вот это:
{
"name": "John",
"age": 26,
"is_married": false,
"children": {
"name": "Julia",
"age": null
},
"skills": [
"Python",
"Git",
"Django",
"Linux"
]
}
Итого
JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript, но может использоваться в любом языке программирования. Легко читается человеком и машиной. Часто используется в REST API (чаще, чем XML из-за лучшей читабельности и меньшего веса).
Корректные значения JSON:
- JSON-объект — неупорядоченное множество пар «ключ:значение», заключённое в фигурные скобки { };
- массив — упорядоченный набор значений, разделённых запятыми. Находится внутри квадратных скобок [ ];
- число (целое или вещественное);
- литералы true (логическое значение «истина»), false (логическое значение «ложь») и null;
- строка.