«пустое» для всех полей - PullRequest
1 голос
/ 10 января 2020

Есть ли способ, с помощью которого я могу принудительно omitempty для всех полей в структуре без явно указать его для каждого поля?

type Item struct {
    Name     string `json:"item,omitempty"`
    Quantity int    `json:"quantity,omitempty"`
    Price    int    `json:"price,omitempty"`
}

Это просто пример , исходная структура может иметь слишком много полей.

Кажется, что некрасиво и избыточно для указания omitempty против каждого поля, если мне это нужно для всех полей. Было бы также хорошо, если бы json.Marshal() каким-то образом игнорировал пустые поля, в то время как маршалинг . Кто-то может предложить лучший способ достичь этого или это лучший способ?

1 Ответ

1 голос
/ 12 января 2020

Вы можете реализовать интерфейс json.Marshaller для создания собственного JSON маршаллинга.

Пример:

// Your struct
type Item struct {
    Name     string `json:"item"`
    Quantity int    `json:"quantity"`
    Price    int    `json:"price"`
}

func (i Item) MarshalJSON() ([]byte, error) {
    return json.Marshal(&struct {
        Name string `json:"name"` // Fields that you need
    }{
        Name: i.Name,
    })
}

Тогда:

i := Item{Name: "Apple", Price: 1200}
itemJSON, err := json.Marshal(i)
if err != nil {
    log.Fatalf("%v", err)
}

fmt.Println(string(itemJSON)) // -> {"name":"Apple"}

Также вы можете найти эту статью о пользовательском маршаллинге полезной.

Также, если вам нужны другие JSON представления вашей структуры эта статья будет действительно полезно

...