gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:51 27 4
gpt4 key购买 nike

当将一个结构编码为 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
}

最佳答案

那是因为它们不是空的。您将它们设置为 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))
}

来自documentation

“omitempty”选项指定如果字段具有空值(定义为 false、0、nil 指针、nil 接口(interface)值以及任何空数组、 slice ),则应从编码中省略该字段、映射或字符串。

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

关于json - 使用 omitempty 时将嵌套结构中的 0/False 编码为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com