Omitempty field is not working, how to remove empty structs from the response body?

5.3k Views Asked by At

Api Response Image link

type PolicySpec struct {
    Description      string       `json:"description" yaml:"description"`
    EndpointSelector Selector     `json:"endpointSelector,omitempty" yaml:"ingress,omitempty"`
    Severity         int          `json:"severity,omitempty" yaml:"severity,omitempty"`
    Tags             []string     `json:"tags,omitempty" yaml:"tags,omitempty"`
    Message          string       `json:"message,omitempty" yaml:"message,omitempty"`
    Process          KubeArmorSys `json:"process,omitempty" yaml:"process,omitempty"`
    File             KubeArmorSys `json:"file,omitempty" yaml:"network,omitempty"`
    Action           string       `json:"action,omitempty" yaml:"action,omitempty"`
}

I even though added omitempty in the fields yet getting the empty struct in the yaml and json, how to remove those empty structs from the api response body?

1

There are 1 best solutions below

2
nipuna On

As documentation of yaml library in Go described, empty structs should be omitted with omitempty label. Link - pkg.go.dev/gopkg.in/yaml.v3

omitempty

         Only include the field if it's not set to the zero
         value for the type or to empty slices or maps.
         Zero valued structs will be omitted if all their public
         fields are zero, unless they implement an IsZero
         method (see the IsZeroer interface type), in which
         case the field will be excluded if IsZero returns true.

Here is the sample prove code for that.

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
    "log"
)

type A struct {
    A int `yaml:"a"`
}

type B struct {
    B int `yaml:"b"`
    A A `yaml:"a,omitempty"`
}

func main() {
    b := B{
        B:5,
    }
    encoded, err := yaml.Marshal(b)
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(`encoded - `,string(encoded)) //encoded -  b: 5
}

you can run code here