gpt4 book ai didi

go - 如何将我的自定义 UnmarshalJSON 方法应用于嵌入式结构?

转载 作者:IT王子 更新时间:2023-10-29 00:43:28 26 4
gpt4 key购买 nike

所以,我有结构 P。我需要将一些 json 数据解码到 P,但有时它会出现嵌入式结构,Embedded。在任何一种情况下,我都从 API 中解码 json 并需要格式化“Formatted”字段。在嵌入式情况下,我的解码器似乎没有被调用。

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/

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