使用 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

Go 空结构体 struct 的使用

Go -- 在Go语言中使用JSON struct

go语言json处理

Go语言处理JSon字段

Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?

使用Go解析HTTP返回数据为struct并存入数据库的操作转载