1

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?

6
  • 2
    Change them to pointer types, and if nil they ought to be omitted. At least that's how it works with the encoding/json package, not sure about yaml. encoding/json: "The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string." -- You see? No mention of "empty struct" there. Commented Aug 5, 2021 at 6:26
  • got your point, thanks @mkopriva Commented Aug 5, 2021 at 6:40
  • @mkopriva I think as yaml library documentation says, Zero structs are omitted. Commented Aug 5, 2021 at 6:59
  • Hi @mkopriva for json would it also be the same, since i'm getting this issue now in the json but yaml is working great.. Commented Aug 5, 2021 at 7:22
  • 1
    @AbhishekRatnam the top comment still holds as far as encoding/json is concerned, i.e. omitempty has no effect on emtpy structs and the package does not honor the "IsZeroer" interface. You'll have to use pointers. Commented Aug 5, 2021 at 7:26

1 Answer 1

1

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

Sign up to request clarification or add additional context in comments.

4 Comments

Hi @nipuna for json would it also be the same, since i'm getting this issue now in the json but yaml is working great..
For json, you need to use pointers and pass empty struct as nil. see here
If in the above code we Unmarshall and then print it will not OmitEmpty. yaml.Unmarshal(encoded, &b1) fmt.Println(decoded - , b1)
@Katiyman may be you didn't run it properly. But Go Playground still print it as expected.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.