0Pricing
Go Academy · Урок

Кодирование и декодирование JSON

Marshal, Unmarshal и теги структур

«Кодирование и декодирование JSON» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Обзор encoding/json

Пакет Go encoding/json сериализует значения Go в JSON и десериализует JSON обратно в значения Go с помощью тегов структур и отражения.

json.Marshal

json.Marshal преобразует значение Go в байты JSON. Функция возвращает ошибку для неподдерживаемых типов, таких как каналы, функции и комплексные числа.

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
u := User{Name: "Alice", Age: 30}
data, err := json.Marshal(u)
fmt.Println(string(data)) // {"name":"Alice","age":30}

json.Unmarshal

json.Unmarshal декодирует JSON в значение Go. Целевое значение должно быть указателем.

var u User
err := json.Unmarshal(data, &u)
fmt.Println(u.Name) // "Alice"

Теги структур

Используйте теги структур json:, чтобы управлять именами полей, пропускать пустые значения и исключать неэкспортируемые поля.

type Product struct {
    ID    int    `json:"id"`
    Price float64 `json:"price,omitempty"` // omit if zero
    secret string // unexported: ignored
}

json.Encoder / json.Decoder

Для потоковой обработки, например тел HTTP-ответов и запросов, используйте Encoder и Decoder вместо Marshal и Unmarshal, чтобы не загружать весь блок данных в память.

// Writing
json.NewEncoder(w).Encode(user)
// Reading
var u User
json.NewDecoder(r.Body).Decode(&u)

Декодирование в map[string]any

Декодируйте неизвестный JSON в универсальную карту:

var m map[string]any
json.Unmarshal(data, &m)
fmt.Println(m["name"])

json.Number

По умолчанию числа в универсальных картах декодируются как float64. Используйте decoder.UseNumber(), чтобы декодировать их как json.Number с сохранением точности.

dec := json.NewDecoder(r)
dec.UseNumber()
var m map[string]any
dec.Decode(&m)

Пользовательская сериализация

Реализуйте json.Marshaler или json.Unmarshaler, чтобы управлять кодированием и декодированием типа, например для пользовательских форматов дат.

func (d Date) MarshalJSON() ([]byte, error) {
    return json.Marshal(d.Format("2006-01-02"))
}

Исключение полей

Используйте omitempty, чтобы пропускать нулевые значения. Используйте json:"-", чтобы всегда исключать поле из вывода JSON независимо от его значения.

Hidden string `json:"-"`

Обработка null

JSON null десериализуется в нулевое значение Go для скалярных типов или устанавливает указатель в nil. Нулевой указатель сериализуется как null.

Форматирование вывода

Используйте json.MarshalIndent для удобного чтения вывода:

data, _ := json.MarshalIndent(u, "", "  ")

Быстрая проверка

Что делает тег структуры `json:"name,omitempty"`?

Итоги: кодирование и декодирование JSON

Основные положения:

  • json.Marshal и json.Unmarshal — для данных в памяти; Encoder и Decoder — для потоков
  • Теги структур управляют именами, omitempty и исключением полей
  • Пользовательские типы реализуют Marshaler и Unmarshaler
  • Используйте json.MarshalIndent для отладочного вывода

Часто задаваемые вопросы

Урок «Кодирование и декодирование JSON» бесплатный?

Да — полный текст урока «Кодирование и декодирование JSON» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Кодирование и декодирование JSON»?

Marshal, Unmarshal и теги структур Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Кодирование и декодирование JSON»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Чтение файлов с os и bufio
  2. Запись файлов и временные файлы
  3. Кодирование и декодирование JSON
  4. Потоковая обработка JSON и CSV
← Назад к Go Academy