使用 struct 在 Go 中处理空 JSON 数组
Posted
技术标签:
【中文标题】使用 struct 在 Go 中处理空 JSON 数组【英文标题】:Handling Null JSON Array in Go using struct 【发布时间】:2021-12-08 06:42:39 【问题描述】:在 golang 中追加 struct 后,我们有 struct 并获得 null。 用我在 golang 中的部分代码找到下面的结构。
type XmloutRoomRate struct
CancellationPolicy Policies `bson:"cancellationPolicy" json:"cancellationPolicy"`
type Policies struct
Policies []RoomPolicies `bson:"policies" json:"policies"`
type RoomPolicies struct
Amount float64 `bson:"amount" json:"amount"`
DaysBeforeCheckIn int `bson:"daysBeforeCheckIn" json:"daysBeforeCheckIn"`
cancelPolicyMain := Policies
cancelPolicy := RoomPolicies
if cancelAmount < 0
cancelPolicy.Amount = cancelAmount
cancelPolicy.DaysBeforeCheckIn = cancelDay
cancelPolicyMain.Policies = append(cancelPolicyMain.Policies, cancelPolicy)
else
cancelPolicyMain = agodaPolicies
cancelPolicyMain.Policies = append(cancelPolicyMain.Policies)
当数据呈现时获得正确的数据结构。
"cancellationPolicy":
"policies": [
"amount": 5141.58,
"daysBeforeCheckIn": 5
]
但是当数据不可用时,获取具有空值的结构。
"cancellationPolicy":
"policies": null
我们需要带有空白数组 [] 的实际输出。
"cancellationPolicy":
"policies": []
【问题讨论】:
【参考方案1】:nil
切片值被编组为 JSON null
值。这记录在json.Marshal()
:
数组和切片值编码为 JSON 数组,除了 []byte 编码为 base64 编码字符串,nil 切片编码为空 JSON 值。
非nil
空切片被编组为空 JSON 数组。所以只需将Policies.Policies
初始化为一个非nil
的空切片,它会在输出中为[]
:
cancelPolicyMain = PoliciesPolicies: []RoomPolicies
测试代码:
const cancelDay = 1
for cancelAmount := -500.0; cancelAmount <= 501; cancelAmount += 1000
cancelPolicyMain := Policies
cancelPolicy := RoomPolicies
if cancelAmount < 0
cancelPolicy.Amount = cancelAmount
cancelPolicy.DaysBeforeCheckIn = cancelDay
cancelPolicyMain.Policies = append(cancelPolicyMain.Policies, cancelPolicy)
else
cancelPolicyMain = PoliciesPolicies: []RoomPolicies
cancelPolicyMain.Policies = append(cancelPolicyMain.Policies)
x := XmloutRoomRatecancelPolicyMain
if err := json.NewEncoder(os.Stdout).Encode(x); err != nil
panic(err)
输出(在Go Playground上试试):
"cancellationPolicy":"policies":["amount":-500,"daysBeforeCheckIn":1]
"cancellationPolicy":"policies":[]
【讨论】:
但不和我一起工作。 bcz 我们有多个类似的 for 循环。code
for--Room 级别循环 cancelPolicyMain := Policies for---Policy 级别循环 cancelPolicy := RoomPolicies if cancelAmount code
@sunil 原理是一样的。无论您将 nil
切片留在结构中的哪个位置进行编组,它都会以 JSON null
结尾。将这些切片初始化为非nil
的空切片,它们最终将成为一个空的 JSON 数组 []
。我提供了一个可以在 Go Playground 上运行/验证的工作示例。【参考方案2】:
在数组中,“null”条目的含义很明确:表示缺少该数组条目。
在对象又名字典中,有不同的方式来表示“无条目”:键可能不存在。或者键可能不存在,但有一个空数组作为值。或者密钥可能在那里,但具有“空”值。
您确实需要在数据提供者和处理数据的客户之间达成一致,这其中的每一个都意味着什么。而且由于通常很难更改数据提供者的工作,因此请将您获得的内容转化为您需要的内容。
因此,如果“策略”不作为键存在,或者它是否作为空值存在,您必须确定它的含义。我见过不会生成包含一个元素的数组,而是提供单个元素的软件。所以 "policies": "amount": ..., "daysBeforeCheckin": ... 也是可能的。您决定接受什么,将什么视为数组,以及如何从获得的形式更改为您想要的形式。
【讨论】:
以上是关于使用 struct 在 Go 中处理空 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章