Теги json

Теги json в Go используются для настройки сериализации и десериализации структур в JSON и обратно. Они позволяют изменять имена полей, управлять пропуском пустых значений и обрабатывать специальные случаи. Теги указываются в виде строки после типа поля в структуре.

Синтаксис

goFieldType `json:"имя,опции"`

В теге можно указать имя поля в JSON и дополнительные опции через запятую. Доступные опции: omitempty - пропускать поле, если оно имеет нулевое значение, string - преобразовывать значение в строку, - - исключить поле из сериализации.

Пример

Давайте создадим структуру с различными тегами и сериализуем её в JSON:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Person struct {
  Name   string `json:"fullName"`
  Age    int  `json:"age,omitempty"`
  Email  string `json:"email"`
  Password string `json:"-"`
  Active   bool   `json:"active,string"`
}

func main() {
  p := Person{
    Name:   "John Doe",
    Age:    30,
    Email:  "john@example.com",
    Password: "secret123",
    Active:   true,
  }

  res, _ := json.Marshal(p)
  fmt.Println(string(res))
}

Результат выполнения кода:

go{"fullName":"John Doe","age":30,"email":"john@example.com","active":"true"}

В результате поле Password было исключено, поле Age получило имя age, поле Active преобразовано в строку, а поле Name стало fullName.

Пример

Рассмотрим использование опции omitempty для пропуска полей с нулевыми значениями:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type User struct {
  ID     int  `json:"id"`
  Username string `json:"username"`
  Age    int  `json:"age,omitempty"`
  City   string `json:"city,omitempty"`
}

func main() {
  u := User{
    ID:     1,
    Username: "alice",
  }

  res, _ := json.Marshal(u)
  fmt.Println(string(res))
}

Результат выполнения кода:

go{"id":1,"username":"alice"}

Поля Age и City были пропущены, так как они имеют нулевые значения (0 и пустая строка).

Пример

Продемонстрируем использование опции string для числовых полей:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Product struct {
  ID  int  `json:"id"`
  Name  string `json:"name"`
  Price int  `json:"price,string"`
}

func main() {
  p := Product{
    ID:  101,
    Name:  "Laptop",
    Price: 99999,
  }

  res, _ := json.Marshal(p)
  fmt.Println(string(res))
}

Результат выполнения кода:

go{"id":101,"name":"Laptop","price":"99999"}

Число 99999 было преобразовано в строку "99999" в JSON.

Пример

Покажем десериализацию JSON в структуру с использованием тегов:

gopackage main

import (
  "encoding/json"
  "fmt"
)

type Employee struct {
  FirstName string `json:"first_name"`
  LastName  string `json:"last_name"`
  Salary  int  `json:"salary,omitempty"`
}

func main() {
  jsonData := []byte(`{"first_name":"Bob","last_name":"Smith","salary":50000}`)

  var e Employee
  json.Unmarshal(jsonData, &e)

  fmt.Printf("%+v\n", e)
}

Результат выполнения кода:

go{FirstName:Bob LastName:Smith Salary:50000}

Смотрите также

  • функцию json.Marshal,
    которая сериализует структуру в JSON
  • функцию json.Unmarshal,
    которая десериализует JSON в структуру
  • функцию json.MarshalIndent,
    которая форматирует вывод JSON с отступами
  • функцию json.Valid,
    которая проверяет валидность JSON