繁体   English   中英

使用结构在 Go 中处理空 JSON 数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM