Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling Null JSON Array in Go using struct

we have struct and getting null after append struct in golang. Find below struct with my some part of code in 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)
}

when data present getting proper data structure.

"cancellationPolicy": {
   "policies": [
                {
                  "amount": 5141.58,
                  "daysBeforeCheckIn": 5
                }
              ]
}

But when data not available getting struct with null value.

"cancellationPolicy": {
            "policies": null
           }

We need my actual output with blank array [].

"cancellationPolicy": {
            "policies": []
           }
like image 542
sunil Avatar asked May 18 '26 14:05

sunil


1 Answers

nil slice values are marshaled into JSON null values. This is documented at json.Marshal():

Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON value.

Non-nil empty slices are marshaled into empty JSON arrays. So simply initialize Policies.Policies to a non-nil empty slice, and it will be [] in the output:

cancelPolicyMain = Policies{Policies: []RoomPolicies{}}

Test code:

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)
    }
}

Output (try it on the Go Playground):

{"cancellationPolicy":{"policies":[{"amount":-500,"daysBeforeCheckIn":1}]}}
{"cancellationPolicy":{"policies":[]}}
like image 105
icza Avatar answered May 21 '26 05:05

icza