gpt4 book ai didi

go - 如何处理结构类型中的 nil 结构变量

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

我需要编码/解码 json 以在 golang 中构建。假设结构是

type A struct {
Id string `json:"id"`
Version string `json:"version"`
Actors []actor `json:"actors`
Payload struct {
Name string `json:"name"`
Number string `json:"number"`
}
}
type payload struct {
Name string `json:"name"`
Number string `json:"number"`
}
type actor struct {
Id string `json:"id"`
Type string `json:"type"`
Role string `json:"role"`
}

参与者或负载可能是空的。可能是 json

{
"id": "78a07cea-be2b-499c-b82b-e4f510260484",
"version": "1.0.0",
"actors": [
{
"id": "1234567",
"type": "XXX",
"role": "111"
},
{
"id": "7654321",
"type": "YYY",
"role": "222"
}
],
"payload": ""
}

{
"id": "78a07cea-be2b-499c-b82b-e4f510260484",
"version": "1.0.0",
"actors": [],
"payload": {
"name": "XXXX",
"number": "1234567"
}
}

如果我遵循 struct A 设计并尝试在有效负载为空的情况下编码(marshal) json,我必须按如下方式初始化

a := A{
Id: "78a07cea-be2b-499c-b82b-e4f510260484",
Version: "1.0.0",
Actors: []actor{
actor{
Id: "1234567",
Type: "XXX",
Role: "111",
},
actor{
Id: "7654321",
Type: "YYY",
Role: "222",
},
},
Payload: payload{},
}

这将导致下面的 json 具有一个空的有效载荷结构

{
"id": "78a07cea-be2b-499c-b82b-e4f510260484",
"version": "1.0.0",
"actors": [
{
"id": "1234567",
"type": "XXX",
"role": "111"
},
{
"id": "7654321",
"type": "YYY",
"role": "222"
}
],
"payload": {
"name":"",
"number":""
}
}

有什么方法可以生成

"payload": ""

而不是空白有效负载结构?或者这种json格式还有其他结构设计吗?顺便说一句,我不能将 nil 传递给 Payload 结构。

最佳答案

json.Marshaler interface可以实现自定义JSON编码,json.Unmarshaler interface用于解码(留给读者作为练习):

package main

import (
"encoding/json"
"fmt"
)

type A struct {
Payload payload
}

type payload struct {
Name string `json:"name"`
Number string `json:"number"`
}

func (p payload) MarshalJSON() ([]byte, error) {
if p.Name == "" && p.Number == "" {
return []byte(`""`), nil
}

type _payload payload // prevent recursion
return json.Marshal(_payload(p))
}

func main() {
var a A
b, _ := json.MarshalIndent(a, "", " ")
fmt.Println(string(b))

a.Payload.Name = "foo"
b, _ = json.MarshalIndent(a, "", " ")
fmt.Println(string(b))
}

// Output:
// {
// "Payload": ""
// }
// {
// "Payload": {
// "name": "foo",
// "number": ""
// }
// }

在 Playground 上试试:https://play.golang.org/p/9jhSWnKTnTf

需要特殊的 _payload 类型来防止递归。如果编写return json.Marshal(p),json 包将再次调用MarshalJSON,因为p 是payload 类型,并且payload 实现 json.Marshaler。

_payload 类型与 payload 具有相同的底层类型,但实现 json.Marshaler(详情请参阅 Type definitions),所以它是使用 json 包的标准规则编码的;如果 payload 没有实现 json.Marshaler,它产生的输出与对 payload 类型的值进行编码时产生的输出完全相同。

关于go - 如何处理结构类型中的 nil 结构变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55965774/

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