Обработка JSON в Go (Golang): encoding/json, библиотеки и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Обработка JSON в Go (Golang): от стандартной библиотеки до продвинутых инструментов

JSON (JavaScript Object Notation) — один из самых популярных форматов обмена данными. В Go (Golang) работа с JSON реализована на высшем уровне благодаря мощной стандартной библиотеке encoding/json и множеству сторонних инструментов, которые ускоряют и упрощают разработку. В этой статье мы подробно разберём, как сериализовать, десериализовать, валидировать и оптимизировать JSON в Go, а также рассмотрим популярные библиотеки, которые стоит знать каждому Go-разработчику.

Стандартная библиотека encoding/json

encoding/json — это встроенный пакет Go, который предоставляет все необходимые функции для работы с JSON. Основные возможности:

  • Маршалинг (сериализация) — преобразование Go-структур в JSON-строку.
  • Анмаршалинг (десериализация) — парсинг JSON-строки в Go-структуры.
  • Потоковая обработка — чтение/запись JSON из потоков (io.Reader, io.Writer).
  • Тэги структуры — управление именами полей, пропуск пустых значений, вложенность.

Пример маршалинга и анмаршалинга

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type User struct {
    ID       int    `json:"id"`
    Name     string `json:"name"`
    Email    string `json:"email"`
    IsActive bool   `json:"is_active"`
}

func main() {
    // Маршалинг (структура -> JSON)
    user := User{ID: 1, Name: "Алексей", Email: "alex@example.com", IsActive: true}
    jsonData, err := json.Marshal(user)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(jsonData))
    // Вывод: {"id":1,"name":"Алексей","email":"alex@example.com","is_active":true}

    // Анмаршалинг (JSON -> структура)
    jsonStr := `{"id":2,"name":"Мария","email":"maria@example.com","is_active":false}`
    var user2 User
    err = json.Unmarshal([]byte(jsonStr), &user2)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%+v\n", user2)
    // Вывод: {ID:2 Name:Мария Email:maria@example.com IsActive:false}
}

Работа с неструктурированными данными

Иногда структура JSON заранее неизвестна. В этом случае можно использовать map[string]interface{} или interface{}:

func main() {
    jsonStr := `{"name":"Иван","age":30,"hobbies":["чтение","спорт"]}`
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &data)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(data["name"]) // Иван
    fmt.Println(data["hobbies"].([]interface{})[0]) // чтение
}

Популярные сторонние библиотеки

Хотя encoding/json покрывает большинство задач, для высоконагруженных систем или специфических сценариев стоит рассмотреть альтернативы:

1. easyjson

easyjson — генератор кода для быстрой сериализации/десериализации. Он создаёт оптимизированные функции под ваши структуры, что даёт прирост производительности в 2–5 раз по сравнению со стандартной библиотекой.

  • Требует генерации кода через easyjson.
  • Поддерживает кастомные типы и вложенность.
  • Идеален для микросервисов с высоким RPS.
//go:generate easyjson -all user.go
type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

// После генерации используем: user.MarshalJSON() / user.UnmarshalJSON()

2. gjson

gjson — библиотека для быстрого чтения JSON без полной десериализации. Позволяет получать значения по пути (аналог jq):

import "github.com/tidwall/gjson"

func main() {
    json := `{"user":{"name":"Ольга","age":25}}`
    name := gjson.Get(json, "user.name")
    fmt.Println(name.String()) // Ольга
}

3. jsoniter (json-iterator)

jsoniter — полностью совместимая замена encoding/json с более высокой производительностью и расширенными возможностями (например, поддержка строковых ключей в числах).

import jsoniter "github.com/json-iterator/go"

var json = jsoniter.ConfigCompatibleWithStandardLibrary

func main                    

Рекомендаций