gpt4 book ai didi

实现 MarshalJSON() 的复合结构的 JSON 编码(marshal)处理

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

我最近遇到了以下问题,但没有找到任何解决方案。我在 Go 中有两种结构类型,我们称它们为 Parent 和 Child。 Child 有一个 *Parent 类型的匿名字段。但是,Parent 有一个名为“ID”的字段,它具有第三个结构的类型,我们将其称为“IDType”(在我的实际问题中,这是一个 dialect/sql.NullInt64)。 IDType 有一个 int 字段和一个 bool 字段。

问题如下:Parent 和 Child 都实现 MarshalJSON() 因为对于 Parent 我只希望 JSON 中的 int 字段和对于 Child 一样。然而,似乎两个 MarshalJSON 都推断出只有 Parent 的值在最终 JSON 中编码的结果。

也许一个最小的例子更容易理解:

package main

import (
"encoding/json"
"fmt"
"os"
)

type IDType struct {
Value int
Valid bool
}

type Parent struct {
ID IDType `json:"id"`
SomeString string `json:"some_string"`
}

type Child struct {
*Parent
Status int `json:"status"`
}

func (parent *Parent) MarshalJSON() ([]byte, error) {
type Alias Parent
fmt.Println("Parent")
return json.Marshal(struct {
*Alias
ID int `json:"id"`
}{
Alias: (*Alias)(parent),
ID: parent.ID.Value,
})
}

func (child *Child) MarshalJSON() ([]byte, error) {
type Alias Child
fmt.Println("Child")
return json.Marshal(struct {
*Alias
Status int `json:"status"`
}{
Alias: (*Alias)(child),
Status: child.Status,
})
}

func main() {
ID := IDType{Value: 1, Valid: true}
parent := Parent{ID: ID, SomeString: "Hello"}
child := Child{Parent: &Parent{ID: ID, SomeString: "Hello"}, Status: 1}
json.NewEncoder(os.Stdout).Encode(&parent)
json.NewEncoder(os.Stdout).Encode(&child)
}

输出是:

Parent
{"some_string":"Hello","id":1}
Child
Parent
{"some_string":"Hello","id":1}

我希望是这样的:

Parent
{"some_string":"Hello","id":1}
Child
Parent
{"some_string":"Hello","id":1, "status": 1}

最佳答案

由于自定义 ID 编码,您似乎只定义了自定义编码逻辑。仅为未嵌入的 IDType 类型定义您的自定义编码(marshal)处理,因此编码(marshal)其他类型不会造成任何问题:

func (id *IDType) MarshalJSON() ([]byte, error) {
return json.Marshal(id.Value)
}

并且不需要其他自定义编码。这样,输出将是:

{"id":1,"some_string":"Hello"}
{"id":1,"some_string":"Hello","status":1}

Go Playground 上试试.

关于实现 MarshalJSON() 的复合结构的 JSON 编码(marshal)处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50831987/

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