Go

Работа с JSON и структурами

Algonexys · 07.08.2026 · 👁 0

Теги полей, необязательные значения, кастомный формат времени и разбор неизвестной структуры.

Код

package main

import (
	"encoding/json"
	"fmt"
	"strings"
	"time"
)

type User struct {
	ID       int       `json:"id"`
	Username string    `json:"username"`
	Email    string    `json:"email,omitempty"`
	Password string    `json:"-"`                 // никогда не попадёт в JSON
	Tags     []string  `json:"tags,omitempty"`
	Created  time.Time `json:"created_at"`
	Meta     *Meta     `json:"meta,omitempty"`
}

type Meta struct {
	Source string `json:"source"`
}

func main() {
	user := User{
		ID: 1, Username: "ivan", Password: "секрет",
		Tags: []string{"go", "backend"}, Created: time.Now(),
	}

	data, _ := json.MarshalIndent(user, "", "  ")
	fmt.Println(string(data))

	// Разбор с проверкой лишних полей
	var parsed User
	dec := json.NewDecoder(strings.NewReader(string(data)))
	dec.DisallowUnknownFields()
	if err := dec.Decode(&parsed); err != nil {
		fmt.Println("ошибка разбора:", err)
	}

	// Неизвестная структура
	var any map[string]any
	_ = json.Unmarshal(data, &any)
	fmt.Println(any["username"])
}