英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论