Что такое JSON и как с ним работать в Go?

Ответ

JSON (JavaScript Object Notation) — это легковесный, текстовый формат обмена данными, основанный на синтаксисе JavaScript. Благодаря своей простоте и удобочитаемости он стал стандартом де-факто для коммуникации между веб-сервисами (API).

Основные типы данных в JSON:

  • Объект: Неупорядоченный набор пар ключ:значение в фигурных скобках {}.
  • Массив: Упорядоченный список значений в квадратных скобках [].
  • Строка: Текст в двойных кавычках "...".
  • Число: Целое или с плавающей точкой.
  • Логическое значение: true или false.
  • null: Обозначает отсутствие значения.

В Go для работы с JSON предназначен стандартный пакет encoding/json.

Основные операции:

  1. Сериализация (Marshalling): Преобразование структуры Go в JSON-строку.
  2. Десериализация (Unmarshalling): Преобразование JSON-строки в структуру Go.

Пример работы в Go:

package main

import (
    "encoding/json"
    "fmt"
)

// Используем теги для указания имен полей в JSON
type User struct {
    Name   string `json:"name"`
    Age    int    `json:"age"`
    IsActive bool   `json:"isActive"`
    Courses []string `json:"courses,omitempty"` // omitempty - не включать поле, если оно пустое
}

func main() {
    // 1. Сериализация (Go -> JSON)
    user := User{Name: "Alice", Age: 30, IsActive: true}
    jsonData, err := json.Marshal(user)
    if err != nil {
        fmt.Println("Ошибка сериализации:", err)
        return
    }
    fmt.Println("JSON:", string(jsonData)) // {"name":"Alice","age":30,"isActive":true}

    // 2. Десериализация (JSON -> Go)
    var newUser User
    err = json.Unmarshal(jsonData, &newUser)
    if err != nil {
        fmt.Println("Ошибка десериализации:", err)
        return
    }
    fmt.Printf("Go struct: %+vn", newUser) // Go struct: {Name:Alice Age:30 IsActive:true Courses:[]}
}