omitempty 不会省略 JSON 中的接口 nil 值

Anu*_*dha 3 json go

我试图省略 nil 接口值

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))
}
Run Code Online (Sandbox Code Playgroud)

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

{"val":null}
Run Code Online (Sandbox Code Playgroud)

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

小智 7

文档

结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,除非

  • 该字段的标签是“-”,或
  • 该字段为空,其标签指定了“omitempty”选项。

空值是 false、0、任何 nil 指针或接口值,以及任何长度为零的数组、切片、映射或字符串。

未省略的原因在此处说明

仅当内部值和类型都未设置时,接口值才为零 (nil, nil)。特别是,一个 nil 接口将始终持有一个 nil 类型。如果我们在接口值中存储一个 *int 类型的 nil 指针,则无论指针的值如何,内部类型都将是 *int:(*int, nil)。因此,即使内部指针为零,这样的接口值也将是非零的。

例如

var s []string
s = nil
var temp interface{}
fmt.Println(temp==nil) // true
temp = s
fmt.Println(temp==nil) // false
Run Code Online (Sandbox Code Playgroud)

对于你的情况,你可以做

https://play.golang.org/p/ZZ_Vzwq4QF

https://play.golang.org/p/S5lMgqVXuB