Кодирование и декодирование 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 — локальная установка не требуется.
Все уроки этого курса
- Чтение файлов с os и bufio
- Запись файлов и временные файлы
- Кодирование и декодирование JSON
- Потоковая обработка JSON и CSV