如何在json.Marshal的[]byte中获取空列表[]而不是null?

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

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类型不起作用,因为byteuint8的别名,所以[]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.

huangapple
  • 本文由 发表于 2022年9月4日 16:40:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/73597936.html
匿名

发表评论

匿名网友

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

确定