英文:
How to get empty list [] instead of null for json.Marshal of []byte?
问题
使用[]byte{}
返回一个空列表是不可能的,因为在Go语言中,[]byte{}
表示一个非nil但长度为0的切片。如果你想要得到一个空列表,你可以使用json.Marshal([]string{})
来序列化一个空的字符串切片。以下是修改后的代码示例:
import (
"encoding/json"
"fmt"
)
func main() {
slice1 := []string{} // 非nil但长度为0
json1, _ := json.Marshal(slice1)
fmt.Printf("%s\n", json1) // []
slice2 := []string{} // 空字符串切片
json2, _ := json.Marshal(slice2)
fmt.Printf("%s\n", json2) // []
}
这样,你将得到输出[]
,表示一个空的字符串切片。
英文:
It easy to get an empty list when working with string by using []string{}
:
import (
"encoding/json"
"fmt"
)
func main() {
slice1 := []string{} // non-nil but zero-length
json1, _ := json.Marshal(slice1)
fmt.Printf("%s\n", json1) // []
}
The output of code above is []
, BUT when I work with []byte
even using []byte{}
returns ""
. How should I get an empty list like what I get in []string{}
?
import (
"encoding/json"
"fmt"
)
func main() {
slice2 := []byte{}
json2, _ := json.Marshal(slice2)
fmt.Printf("%s\n", json2) // ""
}
答案1
得分: 2
查看文档:
> 数组和切片值编码为JSON数组,除了[]byte编码为base64编码的字符串,而nil切片编码为null JSON值。
加粗部分是你得到""
的原因。如果你想从[]byte{}
得到[]
,你需要一个自定义的命名为[]byte
的类型,该类型实现了json.Marshaler
接口。
或者,如果你正在寻找一个“整数切片”,那么使用[]N
,其中N
可以是任何基本整数类型,只是不能是uint8
类型。uint8
类型不起作用,因为byte
是uint8
的别名,所以[]uint8
与[]byte
相同,json.Marshal
也会输出""
。
英文:
See the docs:
> Array and slice values encode as JSON arrays, except that []byte
> encodes as a base64-encoded string, and a nil slice encodes as the
> null JSON value.
The part in bold is why you get ""
. If you want []
from []byte{}
, you need a custom named []byte
type that implements the json.Marshaler
interface.
Or, if you're looking for a "slice of integers", then use []N
where N
can be any of the basic integer types just not the uint8
type. The uint8
type will not work because byte
is an alias of uint8
so []uint8
is identical to []byte
and json.Marshal
will output ""
for that as well.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论