Все вопросы

40 Практика

Как закодировать структуру в JSON?

json.Marshal читает экспортированные поля и теги json. json.Unmarshal пишет в указатель на значение. Тег omitempty пропускает нулевое поле. Имя в теге — это имя в JSON, имя поля в Go может быть другим.

Неэкспортированное поле в JSON не попадает и из JSON не заполняется. Если нужно отличить отсутствующее поле от нуля, берут указатель (*string) или тип вроде json.RawMessage и отдельную проверку.

Marshal и Unmarshal возвращают error. Для Marshal ошибки редки, но игнорировать её не стоит: канал Encoder к потоку уже про ошибку не промолчит.

Пример

Go

туда и обратно

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)
}