логотип PurpleSchool
логотип PurpleSchool

Конвертация структур в JSON в Golang

Автор

Олег Марков

Введение

В мире программирования JSON (JavaScript Object Notation) стал одним из наиболее распространенных способов обмена данными между клиентами и серверами. Он прост в использовании, легковесен и широко применяется в веб-разработке. В языке программирования Go (или Golang, как его любят называть) работа с JSON также не представляет больших сложностей, благодаря мощной стандартной библиотеке. Сегодня я покажу вам, как легко конвертировать структуры в JSON и обратно с помощью Go.

Основные возможности работы с JSON в Golang

Прежде чем погрузиться в детали, важно понимать некоторые базовые концепции. Golang предоставляет пакет encoding/json, который содержит функции и методы для работы с JSON, включая конвертацию структур в JSON и наоборот. Нашей главной задачей будет изучение нескольких ключевых функций и методов из этого пакета.

json.Marshal

Начнем с json.Marshal. Эта функция берет структуру (или любой другой тип данных, который можно представить в формате JSON) и возвращает JSON-представление в виде среза байтов ([]byte).

Давайте разберемся на примере:

package main

import (
    "encoding/json"
    "fmt"
)

// Определяем структуру, которую мы будем конвертировать в JSON
type Person struct {
    Name string
    Age  int
    City string
}

func main() {
    // Создаем экземпляр структуры Person
    p := Person{Name: "Иван", Age: 30, City: "Москва"}

    // Конвертируем структуру в JSON
    personJSON, err := json.Marshal(p)
    // Проверяем наличие ошибки
    if err != nil {
        fmt.Println("Ошибка при конвертации в JSON:", err)
        return
    }

    // Печатаем полученный JSON
    fmt.Println(string(personJSON))
}

Как видите, этот код выполняет конвертацию структуры Person в JSON. Обратите внимание на функцию json.Marshal. Мы передаем в эту функцию экземпляр структуры p, и если все прошло успешно, то получаем JSON в виде байт.

json.Unmarshal

Теперь, когда мы разобрались с json.Marshal, давайте обратим внимание на json.Unmarshal. Эта функция делает противоположное — она берет JSON-данные и заполняет ими структуру.

Покажу вам, как это реализовано на практике:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string
    Age  int
    City string
}

func main() {
    // JSON-данные, которые мы будем декодировать
    personJSON := `{"Name":"Иван","Age":30,"City":"Москва"}`
    
    // Переменная для сохранения результата декода
    var p Person
    
    // Декодируем JSON в структуру
    err := json.Unmarshal([]byte(personJSON), &p)
    // Проверяем наличие ошибки
    if err != nil {
        fmt.Println("Ошибка при декодировании JSON:", err)
        return
    }

    // Печатаем результат
    fmt.Printf("%+v\n", p)
}

В этом примере мы используем json.Unmarshal, чтобы преобразовать JSON-строку обратно в структуру Person. Как видите, мы передаем JSON в виде среза байтов и указатель на структуру, которую хотим заполнить данными.

JSON-теги в Golang структурах

Иногда вам необходимо настраивать, как ваши структуры будут конвертироваться в JSON. В Golang вы можете использовать специальные "теги" для полей структуры. Эти теги позволяют задавать имена полей JSON, которые могут отличаться от имен полей структуры.

Давайте посмотрим, как это выглядит в коде:

package main

import (
    "encoding/json"
    "fmt"
)

// Определяем структуру с тегами JSON
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    City string `json:"city,omitempty"` // Поле будет опущено, если оно пустое
}

func main() {
    p := Person{Name: "Иван", Age: 30}

    personJSON, err := json.Marshal(p)
    if err != nil {
        fmt.Println("Ошибка при конвертации в JSON:", err)
        return
    }

    // Преобразованный JSON со всеми активными тегами
    fmt.Println(string(personJSON))
}

Обратите внимание на теги json:"name" и json:"city,omitempty". Теги позволяют нам контролировать, как поля конвертируются в JSON. Например, omitempty указывает, что поле "city" будет исключено из JSON, если оно пустое.

Заключение

Конвертация структур в JSON с помощью Golang является простым и эффективным процессом благодаря функциональности стандартной библиотеки. Используя json.Marshal и json.Unmarshal, вы можете легко преобразовывать как сложные, так и простые структуры в JSON и обратно. Понимание этих инструментов и их возможностей позволит вам лучше управлять данными в ваших проектах, оптимизируя процесс взаимодействия между разными частями системы или серверами и клиентами. Теперь вы вооружены всеми необходимыми знаниями, чтобы уверенно использовать JSON в своих Go-проектах. Удачи!

Стрелочка влевоПреобразование типов в GolangStrconv в GolangСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangОбработка JSON в GoИспользование enum в GolangЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoЗначения в GolangПеременные в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний