Теги json
Теги json в Go используются для настройки сериализации и десериализации структур в JSON и обратно. Они позволяют изменять имена полей, управлять пропуском пустых значений и обрабатывать специальные случаи. Теги указываются в виде строки после типа поля в структуре.
Синтаксис
FieldType `json:"имя,опции"`
В теге можно указать имя поля в JSON и дополнительные опции через запятую. Доступные опции: omitempty - пропускать поле, если оно имеет нулевое значение, string - преобразовывать значение в строку, - - исключить поле из сериализации.
Пример
Давайте создадим структуру с различными тегами и сериализуем её в JSON:
package 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))
}
Результат выполнения кода:
{"fullName":"John Doe","age":30,"email":"john@example.com","active":"true"}
В результате поле Password было исключено, поле Age получило имя age, поле Active преобразовано в строку, а поле Name стало fullName.
Пример
Рассмотрим использование опции omitempty для пропуска полей с нулевыми значениями:
package 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))
}
Результат выполнения кода:
{"id":1,"username":"alice"}
Поля Age и City были пропущены, так как они имеют нулевые значения (0 и пустая строка).
Пример
Продемонстрируем использование опции string для числовых полей:
package 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))
}
Результат выполнения кода:
{"id":101,"name":"Laptop","price":"99999"}
Число 99999 было преобразовано в строку "99999" в JSON.
Пример
Покажем десериализацию JSON в структуру с использованием тегов:
package 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)
}
Результат выполнения кода:
{FirstName:Bob LastName:Smith Salary:50000}
Смотрите также
-
функцию
json.Marshal,
которая сериализует структуру в JSON -
функцию
json.Unmarshal,
которая десериализует JSON в структуру -
функцию
json.MarshalIndent,
которая форматирует вывод JSON с отступами -
функцию
json.Valid,
которая проверяет валидность JSON