Работа с JSON
JSON (JavaScript Object Notation) - это текстовый формат обмена данными, основанный на JavaScript, но независимый от языка. Сегодня это стандарт де-факто для HTTP API.
Что такое JSON?
JSON - это способ представления структурированных данных в виде текста. Он легко читается человеком и легко парсится машиной.
Пример JSON:
{
"name": "John Doe",
"age": 30,
"email": "john@example.com",
"isActive": true,
"roles": ["admin", "user"],
"address": {
"street": "123 Main St",
"city": "New York",
"country": "USA"
}
}
Типы данных в JSON
JSON поддерживает 6 типов данных:
1. Строки (string)
{
"name": "Alice",
"message": "Hello, World!",
"unicode": "Привет! 👋"
}
Строки всегда в двойных кавычках. Специальные символы экранируются:
\"- кавычка\\- обратный слэш\n- новая строка\t- табуляция\u0041- Unicode символ
2. Числа (number)
{
"integer": 42,
"float": 3.14159,
"negative": -273.15,
"scientific": 1.23e-4
}
3. Булевы значения (boolean)
{
"isActive": true,
"isDeleted": false
}
4. null
{
"middleName": null,
"deletedAt": null
}
5. Объекты (object)
{
"user": {
"id": 1,
"profile": {
"firstName": "John",
"lastName": "Doe"
}
}
}
6. Массивы (array)
{
"numbers": [1, 2, 3, 4, 5],
"mixed": [1, "two", true, null],
"users": [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
}
Что НЕ поддерживает JSON
- Комментарии
- Функции
- undefined
- Даты (передаются как строки)
- Trailing comma
// Это НЕ валидный JSON:
{
"name": "John", // комментарий не поддерживается
"age": 30, // trailing comma запрещена
"birthday": new Date(), // функции/объекты не поддерживаются
"callback": function() {} // функции не поддерживаются
}
Работа с JSON в разных языках
// Парсинг JSON
const data = JSON.parse('{"name": "Alice", "age": 30}');
console.log(data.name); // Alice
// Преобразование в JSON
const user = { name: "Bob", age: 25 };
const json = JSON.stringify(user);
console.log(json); // {"name":"Bob","age":25}
// Красивый вывод
const prettyJson = JSON.stringify(user, null, 2);
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"`
}
func main() {
// Парсинг JSON
jsonStr := `{"name": "Alice", "age": 30}`
var user User
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
panic(err)
}
fmt.Println(user.Name) // Alice
// Преобразование в JSON
newUser := User{Name: "Bob", Age: 25}
jsonBytes, _ := json.Marshal(newUser)
fmt.Println(string(jsonBytes))
// Красивый вывод
prettyJSON, _ := json.MarshalIndent(newUser, "", " ")
fmt.Println(string(prettyJSON))
}
<?php
// Парсинг JSON
$json = '{'name': 'Alice', 'age': 30}';
$data = json_decode($json);
echo $data->name; // Alice
// Как ассоциативный массив
$array = json_decode($json, true);
echo $array['name']; // Alice
// Преобразование в JSON
$user = [
'name' => 'Bob',
'age' => 25
];
$json = json_encode($user);
// Красивый вывод
$prettyJson = json_encode($user, JSON_PRETTY_PRINT);
// Обработка ошибок
$data = json_decode($invalidJson);
if (json_last_error() !== JSON_ERROR_NONE) {
echo 'Ошибка: ' . json_last_error_msg();
}
?>
Валидация JSON
Онлайн-инструменты:
Программная валидация:
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
JSON Schema
JSON Schema позволяет описать структуру и валидировать JSON:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name", "email"]
}
Лучшие практики
1. Используйте осмысленные имена
// Плохо
{
"n": "John",
"a": 30,
"e": "john@example.com"
}
// Хорошо
{
"name": "John",
"age": 30,
"email": "john@example.com"
}
2. Будьте консистентны в именовании
// camelCase
{
"firstName": "John",
"lastName": "Doe",
"emailAddress": "john@example.com"
}
// snake_case
{
"first_name": "John",
"last_name": "Doe",
"email_address": "john@example.com"
}
3. Используйте массивы для списков
// Плохо
{
"user1": {"name": "Alice"},
"user2": {"name": "Bob"},
"user3": {"name": "Charlie"}
}
// Хорошо
{
"users": [
{"name": "Alice"},
{"name": "Bob"},
{"name": "Charlie"}
]
}
4. Избегайте глубокой вложенности
// Слишком глубоко
{
"data": {
"users": {
"list": {
"items": [...]
}
}
}
}
// Лучше
{
"users": [...]
}
Альтернативы JSON
- XML - более многословный, но поддерживает атрибуты и namespaces
- YAML - более читаемый, поддерживает комментарии
- MessagePack - бинарный формат, компактнее JSON
- Protocol Buffers - бинарный формат от Google, требует схемы
Производительность
При работе с большими объёмами данных:
- Streaming парсинг - обрабатывайте JSON по частям
- Бинарные форматы - используйте MessagePack или Protobuf
- Сжатие - используйте gzip для передачи по сети
- Кеширование - храните распарсенные объекты
Итоги
JSON - это простой, но мощный формат для обмена данными. Его поддерживают все современные языки и платформы. Понимание JSON критически важно для:
- Разработки и использования API
- Конфигурационных файлов
- Обмена данными между системами
- Хранения структурированных данных
В следующем уроке мы рассмотрим, как защитить API с помощью различных методов аутентификации и авторизации. Парсинг JSON на стороне браузера - через fetch, на сервере Go - через encoding/json.