gpt4 book ai didi

json - omitempty 不会省略 JSON 中的接口(interface) nil 值

转载 作者:IT王子 更新时间:2023-10-29 01:54:28 25 4
gpt4 key购买 nike

我试图省略 nil 接口(interface)值

package main

import (
"fmt"
"encoding/json"
)

type MyStruct struct{
Val interface{} `json:"val,omitempty"`
}

func main() {
var s []string
s = nil
m := MyStruct{
Val : s,
}

b, _:= json.Marshal(m)
fmt.Println(string(b))
}

这是 playground 链接 https://play.golang.org/p/cAE1IrSPgm这输出

{"val":null}

为什么不将其视为空值?有没有办法从 json 中省略这些 nil 值。

最佳答案

来自documentation :

Struct values encode as JSON objects. Each exported struct field becomes a member of the object unless

  • the field's tag is "-", or
  • the field is empty and its tag specifies the "omitempty" option.

The empty values are false, 0, any nil pointer or interface value, and any array, slice, map, or string of length zero.

没有遗漏的原因说明了here

An interface value is nil only if the inner value and type are bothunset, (nil, nil). In particular, a nil interface will always hold anil type. If we store a nil pointer of type *int inside an interfacevalue, the inner type will be *int regardless of the value of thepointer: (*int, nil). Such an interface value will therefore benon-nil even when the pointer inside is nil.

eg :

var s []string
s = nil
var temp interface{}
fmt.Println(temp==nil) // true
temp = s
fmt.Println(temp==nil) // false

对于你的情况,你可以这样做

https://play.golang.org/p/ZZ_Vzwq4QF
或者
https://play.golang.org/p/S5lMgqVXuB

关于json - omitempty 不会省略 JSON 中的接口(interface) nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320960/

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