许多公司的代码生成工具生成go文件的struct带了omitempty
标签.该标签会导致空值的字段转json的时候被忽略。
那么,有没有办法在不删除这个标签的场景下,让空值字段依旧可以输出呢?有的。
json-iterator组件提供了一个扩展,扩展中有一口子 IsEmpty 用于判断每个字段是否为空值.
只要重写IsEmpty方法,永远返回为false(即永远告诉json框架我的字段不是空的不能屏蔽)那么便可以达到我们的诉求。
下面给一下具体的代码。
package ignoreomitemptytag
import (
"unsafe"
jsoniter "github.com/json-iterator/go"
"github.com/modern-go/reflect2"
)
type ignoreOmitEmptyTagExtension struct {
jsoniter.DummyExtension
}
type ignoreOmitEmptyTagEncoder struct {
originDecoder jsoniter.ValEncoder
}
func (p *ignoreOmitEmptyTagEncoder) IsEmpty(ptr unsafe.Pointer) bool { //关键逻辑
return false
}
func (p *ignoreOmitEmptyTagEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {
p.originDecoder.Encode(ptr, stream)
}
func (e *ignoreOmitEmptyTagExtension) DecorateEncoder(typ reflect2.Type, encoder jsoniter.ValEncoder) jsoniter.ValEncoder {
return &ignoreOmitEmptyTagEncoder{encoder}
}
func init() {
jsoniter.RegisterExtension(&ignoreOmitEmptyTagExtension{})
}