gpt4 book ai didi

当嵌入式类型具有 UnmarshalJSON 时,json.Unmarshal 失败

转载 作者:IT王子 更新时间:2023-10-29 00:40:31 25 4
gpt4 key购买 nike

我正在尝试解码具有嵌入式类型的结构。当嵌入类型具有 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 方法以使其正常工作。

最佳答案

这是预期的。

创建别名时:

type Alias Foo

Alias 不会继承 Foo 的方法,因为它是具有不同方法集的不同类型,这是您想要避免无限递归的目的。

但是,嵌入式EmbeddedStructUnmarshalJSON方法将被提升!

因此,Alias 将有一个 UnmarshalJSON 方法,它只会解码 EmbeddedStruct 的值,而不是使用您想要的默认解码.

关于当嵌入式类型具有 UnmarshalJSON 时,json.Unmarshal 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29667379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com