所以,我有结构 P。我需要将一些 json 数据解码到 P 中,但有时它是嵌入式结构,嵌入式。在任何一种情况下,我都会从 API 解码 json 并需要格式化“格式化”字段。似乎在 Embedded 情况下,我的解码器没有被调用。
我 have the following code :
package main
import (
"encoding/json"
"fmt"
)
type P struct {
Name string `json:"name"`
Formatted string `json:"formatted"`
}
type Embedded struct {
A struct {
B struct {
*P
} `json:"b"`
} `json:"a"`
}
func (p *P) UnmarshalJSON(b []byte) error {
type Alias P
a := &struct {
*Alias
}{
Alias: (*Alias)(p),
}
if err := json.Unmarshal(b, &a); err != nil {
return err
}
a.Formatted = fmt.Sprintf("Hi, my name is %v", a.Name)
return nil
}
func simple() {
b := []byte(`{"name":"bob"}`)
p := &P{}
if err := json.Unmarshal(b, &p); err != nil {
panic(err)
}
fmt.Printf("normal: %+v\n", p)
}
func embedded() {
b := []byte(`{"a":{"b":{"name":"bob"}}}`)
e := &Embedded{}
if err := json.Unmarshal(b, &e); err != nil {
panic(err)
}
fmt.Printf("embedded: %+v\n", e.A.B.P)
}
func main() {
simple()
embedded()
}
(我意识到我可以摆脱自定义解码器并创建一种方法来格式化名称,但想看看这种方式是否可行。)
最佳答案
我知道的不够多,无法解释所有的原因,我只会列出哪些有效,哪些无效。知识渊博的人可以告诉你背后的原因。
当 B 是 *struct
时,以下工作,不知道为什么。
type Embedded struct {
A struct {
B *struct {
P
} `json:"b"`
} `json:"a"`
}
以下也有效。我猜测使用匿名结构在最后一个中有一些影响,因为这里不需要 *struct
。type embedP struct {
P
}
type Embedded struct {
A struct {
B embedP `json:"b"`
} `json:"a"`
}
如果 *P
已初始化,则以下内容有效。type embedP struct {
*P
}
type intermediate struct {
B embedP `json:"b"`
}
type Embedded struct {
A intermediate `json:"a"`
}
e := &Embedded{A:intermediate{embedP{P:&P{}}}}
但同样的事情不适用于匿名结构。type Embedded struct {
A struct {
B struct {
*P
} `json:"b"`
} `json:"a"`
}
e := &Embedded{A : struct{B struct{*P}`json:"b"`}{B: struct{*P}{&P{}}}}
Play link其他改进
如果
p := &P{}
已经是一个指针,则不需要在 json.Unmarshal 中传递 &p。 json.Unmarshal(b, p)
就足够了。与 e := &Embedded{}
相同。关于go - 如何将我的自定义 UnmarshalJSON 方法应用于嵌入式结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46658461/