Я пытаюсь разобрать структуру со встроенным типом. Когда встроенный тип имеет метод UnmarshalJSON, демаршалирование внешнего типа завершается ошибкой:
https://play.golang.org/p/Y_Tt5O8A1Q
package main
import (
"fmt"
"encoding/json"
)
type Foo struct {
EmbeddedStruct
Field string
}
func (d *Foo) UnmarshalJSON(from []byte) error {
fmt.Printf("Foo.UnmarshalJSON\n")
type Alias Foo
alias := &Alias{}
if err := json.Unmarshal(from, alias); err != nil {
return fmt.Errorf("Error in Foo.UnmarshalJSON: json.Unmarshal returned an error:\n%v\n", err)
}
*d = Foo(*alias)
return nil
}
type EmbeddedStruct struct {
EmbeddedField string
}
func (d *EmbeddedStruct) UnmarshalJSON(from []byte) error {
fmt.Printf("EmbeddedStruct.UnmarshalJSON\n")
type Alias EmbeddedStruct
alias := &Alias{}
if err := json.Unmarshal(from, alias); err != nil {
return fmt.Errorf("Error in EmbeddedStruct.UnmarshalJSON: json.Unmarshal returned an error:\n%v\n", err)
}
*d = EmbeddedStruct(*alias)
return nil
}
func main() {
data := `{"EmbeddedField":"embeddedValue", "Field": "value"}`
foo := &Foo{}
json.Unmarshal([]byte(data), foo)
fmt.Printf("Foo: %v\n", foo)
if foo.EmbeddedField != "embeddedValue" {
fmt.Printf("Unmarshal didn't work, EmbeddedField value is %v. Should be 'embeddedValue'\n", foo.EmbeddedField)
}
if foo.Field != "value" {
fmt.Printf("Unmarshal didn't work, Field value is %v. Should be 'value'\n", foo.Field)
}
}
Результат:
Foo.UnmarshalJSON
EmbeddedStruct.UnmarshalJSON
Foo: &{{embeddedValue} }
Unmarshal didn't work, Field value is . Should be 'value'
... так что обе пользовательские функции демаршалирования работали. Значение из встроенной структуры правильное, но значение из внешней структуры потеряно.
Если мы просто удалим метод EmbeddedStruct.UnmarshalJSON, он будет работать, как и ожидалось.
Я делаю что-то неправильно? Ожидается ли это? Или ошибка? Я уверен, что есть способ настроить мои методы UnmarshalJSON, чтобы заставить их работать.