40 Практика
Как закодировать структуру в JSON?
Ответ
json.Marshal читает экспортированные поля и теги json. json.Unmarshal пишет в указатель на значение. Тег omitempty пропускает нулевое поле. Имя в теге — это имя в JSON, имя поля в Go может быть другим.
Подробнее
Неэкспортированное поле в JSON не попадает и из JSON не заполняется. Если нужно отличить отсутствующее поле от нуля, берут указатель (*string) или тип вроде json.RawMessage и отдельную проверку.
Marshal и Unmarshal возвращают error. Для Marshal ошибки редки, но игнорировать её не стоит: канал Encoder к потоку уже про ошибку не промолчит.
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Bio string `json:"bio,omitempty"`
}
func main() {
raw, err := json.Marshal(User{ID: 1, Name: "Аня"})
if err != nil {
panic(err)
}
fmt.Println(string(raw))
var out User
if err := json.Unmarshal(raw, &out); err != nil {
panic(err)
}
fmt.Println(out.Name)
}