使用 omitempty 时将嵌套结构中的 0/False 编组为 json

问题描述 投票:0回答:2

将结构编组为 JSON 时,我可以将一个变量分配给它对应的“空值”,并且即使在使用 omitempty 时仍然传递它,但是我无法在嵌套结构中获得相同的结果,因为尽管它是一个指针。这可能吗?

type Foo struct {
    Bar Bar `json:"bar,omitempty"`
    A *int  `json:"a,omitempty"`  //Does not get omitted when a = 0
    B *bool `json:"b,omitempty"`  //Does not get omitted when b = false
}

type Bar struct {
    X *int  `json:"x,omitempty"`  //Gets omitted when x = 0
    Y *bool `json:"y,omitempty"` //Gets omitted when y = false
}
json go struct
2个回答
1
投票

那是因为它们不为空..您将它们设置为 0/false。 0/false 并不意味着它们不存在,您通过为它们分配一个值来在内存中提供一个空间。

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar Bar   `json:"bar,omitempty"`
    A   *int  `json:"a,omitempty"` //Does not get omitted when a = 0
    B   *bool `json:"b,omitempty"` //Does not get omitted when b = false
}

type Bar struct {
    X *int  `json:"x,omitempty"` //Gets omitted when x = 0
    Y *bool `json:"y,omitempty"` //Gets omitted when y = false
}

func main() {
    var obj Foo
    a := 0 // a will not be not empty, it's set to 0
    obj.A = &a

    b, _ := json.MarshalIndent(obj, "", " ")
    fmt.Println(string(b))

    var obj2 Foo
    // a and everything else will be empty, nothing is set

    b, _ = json.MarshalIndent(obj2, "", " ")
    fmt.Println(string(b))
}

来自文档

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.

措辞可以更好,但在这种情况下为空意味着没有为该字段分配任何内容。这并不意味着如果该字段实际上设置为 0 或 false,它将为空。 False 和 0 也是值,如果您分配它们,则该字段将变为 0 或 false。


0
投票

这是因为它们是指针。空指针只是 nil,如果你希望它忽略 0 值变量,你需要像这样编写结构:

type Foo struct {
    Bar Bar `json:"bar,omitempty"`
    A int  `json:"a,omitempty"`  //Will get omitted when a = 0
    B bool `json:"b,omitempty"`  //Will get omitted when b = false
}

如果你有这个: A *int,意思是如果A被赋值为0,它是一个指向值为0的整数的指针,因此它有内存分配。

© www.soinside.com 2019 - 2024. All rights reserved.