Go
Работа с JSON и структурами
Теги полей, необязательные значения, кастомный формат времени и разбор неизвестной структуры.
Код
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"])
}