簡體   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