omitempty在JSON中不会省略接口类型的nil值。

huangapple go评论143阅读模式
英文:

omitempty doesn't omit interface nil values in JSON

问题

我正在尝试省略空接口值。

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))
}

这段代码的输出结果是:

{"val":null}

为什么它没有将其视为空值?有没有办法从 JSON 中省略这些空值?

英文:

I'm trying to omit nil interface values

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))
}

Here is the playground link https://play.golang.org/p/cAE1IrSPgm
This outputs

{"val":null}

Why is it not treating it as an empty value? Is there a way to omit these nil values from json.

答案1

得分: 9

根据文档

结构体值会被编码为JSON对象。除非:

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

否则每个导出的结构体字段都会成为对象的成员。

不进行省略的原因在这里有说明:

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

英文:

From the 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.

The reason it is not omitting is stated here

> An interface value is nil only if the inner value and type are both
> unset, (nil, nil). In particular, a nil interface will always hold a
> nil type. If we store a nil pointer of type *int inside an interface
> value, the inner type will be *int regardless of the value of the
> pointer: (*int, nil). Such an interface value will therefore be
> non-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

For your case, you can do

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

huangapple
  • 本文由 发表于 2017年6月2日 12:45:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/44320960.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定