[英]Handling Null JSON Array in Go using struct
在golang中追加结构后,我们有结构并获得空值。 使用我在 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": []
}
nil
切片值被编组为 JSON null
值。 这记录在json.Marshal()
:
数组和切片值编码为 JSON 数组,除了 []byte 编码为 base64 编码字符串,而nil 切片编码为空 JSON 值。
非nil
空切片被编组为空 JSON 数组。 因此,只需将Policies.Policies
初始化为一个空切片,它将在输出中为[]
:
cancelPolicyMain = Policies{Policies: []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 = Policies{Policies: []RoomPolicies{}}
cancelPolicyMain.Policies = append(cancelPolicyMain.Policies)
}
x := XmloutRoomRate{cancelPolicyMain}
if err := json.NewEncoder(os.Stdout).Encode(x); err != nil {
panic(err)
}
}
输出(在Go Playground上试试):
{"cancellationPolicy":{"policies":[{"amount":-500,"daysBeforeCheckIn":1}]}}
{"cancellationPolicy":{"policies":[]}}
在数组中,“空”条目的含义很明确:这意味着缺少此数组条目。
在对象又名字典中,有不同的方式来表示“没有条目”:键可能不存在。 或者键可能不存在,但有一个空数组作为值。 或者密钥可能在那里,但具有“空”值。
您确实需要在数据提供者和处理它的客户之间达成一致,这些都是什么意思。 而且由于通常很难改变数据提供者所做的事情,因此将您获得的内容转化为您需要的内容。
因此,您必须决定如果“policies”不作为键存在,或者它作为空值存在,这意味着什么。 我见过一些软件不会产生一个元素的数组,而是提供单个元素。 所以 "policies": { "amount": ..., "daysBeforeCheckin": ... } 也是可能的。 您决定接受什么,将什么视为数组,以及如何从获得的形式更改为所需的形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.