Пустое поле в JSON в Go
Метка пропуска пустое поле, чтобы его
не было в тексте. К имени ключа через
запятую добавляют слово omitempty;
при нулевом значении поля ключ не
записывают.
Нулевым считают пустую строку, число
0, false, пустой срез,
пустую карту и nil для указателя.
Если значение задано, ключ появляется
как обычно.
Сравним запись с заметкой и без нее:
package main
import (
"encoding/json"
"fmt"
)
type Item struct {
Title string `json:"title"`
Note string `json:"note,omitempty"`
}
func main() {
withNote := Item{Title: "go", Note: "ok"}
emptyNote := Item{Title: "go"}
a, _ := json.Marshal(withNote)
b, _ := json.Marshal(emptyNote)
fmt.Println(string(a))
fmt.Println(string(b))
}
Первая строка содержит "note",
во второй ключа "note" нет.
Поле Title остается в обеих
строках.
Тот же флаг работает для чисел:
package main
import (
"encoding/json"
"fmt"
)
type Score struct {
Name string `json:"name"`
Bonus int `json:"bonus,omitempty"`
}
func main() {
s := Score{Name: "ann"}
data, _ := json.Marshal(s)
fmt.Println(string(data))
}
Дана структура:
type Row struct {
Code int `json:"code"`
Flag bool `json:"flag,omitempty"`
}
Соберите текст для значения с кодом
1 и Flag равным false
и скажите, будет ли ключ "flag".
Дана структура:
type Bag struct {
Tags []string `json:"tags,omitempty"`
}
Соберите текст для нулевого значения
и скажите, появится ли ключ "tags".
Дана структура:
type Pair struct {
Left int `json:"left,omitempty"`
Right int `json:"right"`
}
При сборке значения с Left равным
0 и Right равным 5
перечислите ключи, которые останутся
в тексте.