登录
首页 >  Golang >  Go问答

如何在字节json.Marshal中将空切片转换为空数组而不是null?

来源:stackoverflow

时间:2024-03-26 10:33:34 407浏览 收藏

使用 `json.Marshal` 处理空切片时,字符串切片 (`[]string{}`) 会转换为 JSON 空数组 (`[]`),而字节切片 (`[]byte{}`) 则会转换为空字符串 (`""`)。这是因为 `[]byte` 在 JSON 中被编码为 Base64 编码的字符串,而 `nil` 切片则编码为空 JSON 值。要获得类似 `[]string{}` 的空列表,需要实现 `json.Marshaler` 接口或使用 `[]N`,其中 `N` 为基本整数类型(但不能是 `uint8`)。

问题内容

使用 []string{} 处理字符串时很容易获得空列表:

import (
    "encoding/json"
    "fmt"
)

func main() {
    slice1 := []string{} // non-nil but zero-length
    json1, _ := json.marshal(slice1)
    fmt.printf("%s\n", json1) // []
}

上面代码的输出是 []但是当我使用 []byte 时,甚至使用 []byte{} 返回 ""。我应该如何获得像 []string{} 中那样的空列表?

import (
    "encoding/json"
    "fmt"
)

func main() {
    slice2 := []byte{}
    json2, _ := json.Marshal(slice2)
    fmt.Printf("%s\n", json2) // ""
}

正确答案


参见 docs

数组和切片值编码为 JSON 数组,除了 []byte 编码为 Base64 编码的字符串,nil 切片编码为 空 JSON 值。

粗体部分是为什么你得到""。如果您想要来自 []byte{}[],则需要一个名为 []byte 的自定义类型来实现 json.Marshaler 接口。

或者,如果您正在寻找“整数切片”,请使用 []N,其中 N 可以是任何基本整数类型,但不能是 uint8 类型。 uint8 类型将不起作用,因为 byteuint8 的别名,因此 []uint8[]bytejson 相同。Marshal 将输出 ""zqben dczqb 也是如此。

终于介绍完啦!小伙伴们,这篇关于《如何在字节json.Marshal中将空切片转换为空数组而不是null?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>