Работа с 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, требует схемы

Производительность

При работе с большими объёмами данных:

  1. Streaming парсинг - обрабатывайте JSON по частям
  2. Бинарные форматы - используйте MessagePack или Protobuf
  3. Сжатие - используйте gzip для передачи по сети
  4. Кеширование - храните распарсенные объекты

Итоги

JSON - это простой, но мощный формат для обмена данными. Его поддерживают все современные языки и платформы. Понимание JSON критически важно для:

  • Разработки и использования API
  • Конфигурационных файлов
  • Обмена данными между системами
  • Хранения структурированных данных

В следующем уроке мы рассмотрим, как защитить API с помощью различных методов аутентификации и авторизации. Парсинг JSON на стороне браузера - через fetch, на сервере Go - через encoding/json.

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