Skip to main content

json 编译之后空值消失的问题

json 编译之后,空值消失的问题 是因为标签中的 omitempty 引起的

无论是int、 string、interface、*ptr还是slice、map类型的字段,当没有显式初始化时, 编译器都能默认地给设置一个相应类型的零值,而恰好该字段又有omitempty关键字时,转换到json对象时就会因为这个字段为一个零值忽略掉该字段。

package main

import (
"encoding/json"
"fmt"
)
// 如果`json:"code"`去掉.会以字段名称为解析内容
type Result struct {
Code int `json:"code"`
Message string `json:"msg,omitempty"`
}

func main() {
var res Result
res.Code = 200
res.Message = "success"

//序列化
jsons, errs := json.Marshal(res)
if errs != nil {
fmt.Println("json marshal error:", errs)
}
fmt.Println("json data :", string(jsons))

//反序列化
var res2 Result
errs = json.Unmarshal(jsons, &res2)
if errs != nil {
fmt.Println("json unmarshal error:", errs)
}
fmt.Println("res2 code:", res2.Code)
fmt.Println("res2 msg:", res2.Message)

}

项目中这样定义 protobuf 生成的 protobuf 不带 omitempty

message UnionTelPosAck {
ErrCode errCode = 1;
Coord pos = 2 [ (gogoproto.nullable) = false ]; // 传送位置 (自定义类型)
Coord leaderPos = 3; // 盟主位置
bool needApply = 4 [ (gogoproto.jsontag) = "needApply" ]; // 是否需要申请 (基础类型)
}
syntax = "proto3";
package cspb;

import "vendor/github.com/gogo/protobuf/gogoproto/gogo.proto";
option (gogoproto.goproto_unrecognized_all) = false;
option (gogoproto.goproto_unkeyed_all) = false;
option (gogoproto.goproto_sizecache_all) = false;

import "pb/cspb/def.proto";
import "pb/cspb/struct.proto";


type UnionTelPosAck struct {
ErrCode ErrCode `protobuf:"varint,1,opt,name=errCode,proto3,enum=cspb.ErrCode" json:"errCode,omitempty"`
Pos Coord `protobuf:"bytes,2,opt,name=pos,proto3" json:"pos"`
LeaderPos *Coord `protobuf:"bytes,3,opt,name=leaderPos,proto3" json:"leaderPos,omitempty"`
NeedApply bool `protobuf:"varint,17,opt,name=needApply,proto3" json:"needApply"`
}