Loading

golang 结构体中空数组被序列化成null解决方法

golang结构体里面空数组会被序列化成null,但是在写接口的时候前端会要求数组类型变量没有数据的话就传空数组,这种情况可以先定义一个数组类型然后重写该数组类型的MarshalJSON()方法,当数组的长度是0的时候直接返回json.Marshal([]interface{}{})就可以了。

/*
  * Author: oy
  * Email:  oyblog@qq.com
  * Date:   2021/6/13 20:13
  * File :  unit_test.go
*/
package script

import (
	"encoding/json"
	"fmt"
	"testing"
)

type Ints []int

func (i Ints) MarshalJSON() ([]byte, error) {
	if len(i) == 0 {
		return json.Marshal([]interface{}{})
	} else {
		var tempValue []interface{} // 这里需要重新定义一个变量,再序列化,否则会造成循环调用
		for _, item := range i {
			tempValue = append(tempValue, item)
		}
		return json.Marshal(tempValue)
	}
}

type TestStruct struct {
	Ids  []int
	Id1  Ints
	Ids2 Ints
}

func Test(t *testing.T) {
	ids2 := []int{1, 2, 3, 4}
	testStruct := TestStruct{}
	testStruct.Ids2 = ids2 //不需要将ids2定义成Ints,用原有的类型就可以了
	marshal, _ := json.Marshal(testStruct)
	fmt.Println(string(marshal))
}


=== RUN   Test
{"Ids":null,"Id1":[],"Ids2":[1,2,3,4]}
--- PASS: Test (0.00s)
PASS
posted @ 2021-05-01 20:55  Just-Like  阅读(2418)  评论(0编辑  收藏  举报