Почему кодирование элементов структуры JSON не вызывает пользовательский MarshalJSON? - PullRequest
0 голосов
/ 09 октября 2018

В Golang у меня есть структура, членом которой является пользовательский тип int с постоянными значениями.По сути, пользовательский тип является логическим перечислением.

type Flavor int

const (
    Vanilla Flavor = iota
    Chocolate
    Strawberry
)

func (f *Flavor) MarshalJSON() ([]byte, error) {
    return []byte(strconv.Quote(f.String())), nil
}

Пользовательский тип определил функции MarshalJSON и UnmarshalJSON, поэтому при сериализации пользовательского типа в JSON я ожидаю получить строку значения в сериализованном выводе, а незначение int.

Моя проблема в том, что если у меня есть указатель на содержащий тип, то содержащий маршалы типа используют пользовательскую функцию, но если попытаться выполнить маршалинг только с помощью значения структуры, пользовательский MarshalJSON не вызывается пакетом JSON

type Dessert struct {
    Flavor Flavor `json:"flavor"`
    Count  int
}
....
    d := Dessert{Strawberry, 13}

    b, err = json.Marshal(d) // !! does not invoke members Marshal !!
    b, err = json.Marshal(&d) // works as expected
....

производит

{"flavor":2,"Count":13}
{"flavor":"Strawberry","Count":13}

Я ожидал второй вывод в обоих случаях.
Почему передача значения структуры не вызывает MarshalJSON для члена, но кодирует в противном случае правильный JSON?

полный рабочий код см. https://play.golang.org/p/mOl1GHhgynf

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

о даЯ думаю, что у тебя были Волкер и Леон.Я предполагал, что мне нужен приемник указателя для MarshalJSON, так как UnmarshalJSON определенно нуждается в приемнике указателя.Но

func (f Flavor) MarshalJSON() ([]byte, error) {
...
func (f *Flavor) UnmarshalJSON(b []byte) error {
...

и смешивание получателей приводят к ожидаемому результату как для json.Marshal (d) , так и json.Marshal (& d)

0 голосов
/ 09 октября 2018

В вашем коде Flavor есть не есть метод MarshalJSON, так как вы определили метод только для *Flavor.

Если вы хотите, чтобы type Flavor имел метод MarshalJSON, вы должны определить его для Flavor, а не *Flavor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...