omitempty没有在JSON中省略接口nil值

时间:2017-06-02 04:45:34

标签: 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))
}

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

{"val":null}

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

1 个答案:

答案 0 :(得分:3)

来自documentation

  

Struct值编码为JSON对象。除非

,否则每个导出的struct字段都将成为该对象的成员      
      
  • 字段的标记是" - "或
  •   
  • 该字段为空,其标记指定" omitempty"选项。
  •   
     

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

没有省略的原因是here

  

仅当内部值和类型都是两者时,接口值才为nil   未设置,(无,无)。特别是,nil接口将始终保持   零类型。如果我们在接口中存储类型为* int的nil指针   值,内部类型将是* int,无论值是什么   指针:(* int,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