golang json.Marshal() slice的零值被转换成null了

clipboard.png
go的json库把零值slice转换为null了,我想在返回的json里保留空slice [],请问有什么办法不让他转换为null?

阅读 23.9k
7 个回答

@凌云识木 slice的零值是nil,转化后就是json的null,文档是ok的.

@xialeistudio 你的data["a"]是有值的, 且不是零值, 这种情况下转成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

手动赋一个空的slice, 要不就在调用端处理这个

变量值为nil时,json编码后就会输出null,可以赋值一个空的slice,什么类型都可以,编码后就会生成[]

你是不是跟php搞到一起了?[]代表的不是null 就是一个空数组而已!如果你想要null 那就a:nil

新手上路,请多包涵

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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题