gpt4 book ai didi

json - 在go中动态编码json键

转载 作者:行者123 更新时间:2023-12-01 20:23:55 24 4
gpt4 key购买 nike

我希望 json 输出如下所示。请注意,基于参数类型,如 documenttext , 下一个键变为 documenttext .

  "components": [
{
"type" : "header",
"parameters": [
{
"type": "document",
"document": {
"filename":"dummy.pdf",
"link": "https://en.unesco.org/inclusivepolicylab/sites/default/files/dummy-pdf_2.pdf"
}
}
]
},
{
"type" : "body",
"parameters": [
{
"type": "text",
"text": "replacement_text"
}
]
}
]

这是我的结构定义:
type Component struct {
Type string `json:"type,omitempty"`
Parameters []Parameter `json:"parameters,omitempty"`
}

type Parameter struct {
Type string `json:"type,omitempty"`
TypeInformation map[string]interface{}
}

当我对其进行编码时,它是这样的:
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"TypeInformation": {
"text": "Param1"
}
},
{
"type": "text",
"TypeInformation": {
"text": "param2"
}
}
]
},
{
"type": "header",
"parameters": [
{
"type": "document",
"TypeInformation": {
"document": {
"link": "http://link",
"filename": "dummy.pdf"
}
}
}
]
}
]

我不想要 TypeInformation关键是在 json 中,我只想要内部对象。我怎样才能做到这一点?

最佳答案

而不是像使用 Parameter 那样使用带有任意映射的“通用”结构您可以为每种参数类型使用不同的具体类型。然后,只需将它们放入一片空接口(interface)中,json.Marshal 就会知道该做什么。

type Object struct {
Components []Component `json:"components"`
}

type Component struct {
Type string `json:"type,omitempty"`
Parameters []interface{} `json:"parameters,omitempty"`
}

type TextParameter struct {
Type textType `json:"type"`
Text string `json:"text"`
}

type DocumentParameter struct {
Type documentType `json:"type"`
Document Document `json:"document"`
}

type Document struct {
FileName string `json:"filename"`
Link string `json:"link"`
}

// used to "hard code" the type of the parameter
type textType struct{}

func (textType) MarshalJSON() ([]byte, error) { return []byte(`"text"`), nil }

// used to "hard code" the type of the parameter
type documentType struct{}

func (documentType) MarshalJSON() ([]byte, error) { return []byte(`"document"`), nil }

然后你可以像这样初始化一个实例:
obj := Object{
Components: []Component{{
Type: "header",
Parameters: []interface{}{
DocumentParameter{Document: Document{
FileName: "dummy.pdf",
Link: "https://en.unesco.org/inclusivepolicylab/sites/default/files/dummy-pdf_2.pdf",
}},
},
}, {
Type: "body",
Parameters: []interface{}{
TextParameter{Text: "replacement_text"},
},
}},
}

https://play.golang.org/p/aNpnSGn980a

关于json - 在go中动态编码json键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61930633/

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