go的json库把零值slice转换为null了,我想在返回的json里保留空slice [],请问有什么办法不让他转换为null?
go的json库把零值slice转换为null了,我想在返回的json里保留空slice [],请问有什么办法不让他转换为null?
func main() {
data := map[string]interface{}{
"a": make([]string, 0),
}
buf, err := json.Marshal(&data)
log.Println(string(buf), err)
}
输出
2018/01/29 18:43:46 {"a":[]} <nil>
眼见为实
,结果是空数组。不是什么null
https://play.golang.org/p/szO...
package main
import (
"encoding/json"
"log"
)
type S struct {
A []string
}
func main() {
data := &S{}
data2 := &S{A: []string{}}
buf, err := json.Marshal(&data)
log.Println(string(buf), err)
buf2, err2 := json.Marshal(&data2)
log.Println(string(buf2), err2)
}
2009/11/10 23:00:00 {"A":null} <nil>
2009/11/10 23:00:00 {"A":[]} <nil>
func TestZeroJson(t *testing.T) {
type JSONTestType struct {
Array []int `json:"array"`
}
var j = JSONTestType{Array: nil}
if JByte, err := json.Marshal(j); err == nil {
fmt.Println("array1: ", string(JByte))
} else {
fmt.Println("marshal1 err ", err)
}
var jStr = `{"array":null}`
if jsonErr := json.Unmarshal([]byte(jStr), &j); jsonErr == nil {
if JByte, err := json.Marshal(j); err == nil {
fmt.Println("array2: ", string(JByte))
} else {
fmt.Println("marshal2 err ", err)
}
} else {
fmt.Println("unmarshal err ", jsonErr)
}
}
我测试了一下。貌似和你说的不太一样哦~
=== RUN TestZeroJson
array1: {"array":null}
array2: {"array":null}
--- PASS: TestZeroJson (0.00s)
PASS
7 回答5.3k 阅读
6 回答6.9k 阅读✓ 已解决
4 回答2.3k 阅读
1 回答2k 阅读✓ 已解决
1 回答3.4k 阅读
2 回答2.2k 阅读
1 回答2.1k 阅读
@凌云识木 slice的零值是
nil
,转化后就是json的null
,文档是ok的.@xialeistudio 你的data["a"]是有值的, 且不是零值, 这种情况下转成
null
才是有问题.