Protobuf3's pit
						
							
 problem description 
 after protobuf rises from 2 to 3, there is a very annoying pit: 
protobuf
 related codes 
message UserInfo{
    bool IsAuth = 1;
    string Name = 2;
}
 if IsAuth is false, it returns {"Name": "xxxx"} 
 if IsAuth is true, it returns {"IsAuth": true, "Name": "xxxxx"} 
.
 similar problems and a lot of int32=0,string= "" ignore fields 
 here comes the problem 
 We interact with the front end using the missing field jsonrpc, which makes the front end not very friendly to deal with. I wonder if there is any way to solve this problem. 
						 
												
					 
					
						
 there is a better solution. 
 the file generated by proto is still best not to modify it, it is reasonable to exist. 
 you can take a look at this. 
var pbMarshaler jsonpb.Marshaler
func init() {
    pbMarshaler = jsonpb.Marshaler{
        EmitDefaults: true,
        OrigName:     true,
        EnumsAsInts:  true,
    }
}
 there is a Marshal method to read the pb object to buffer, and the rest is buffer.Bytes (). 
 this method is very convenient and is recommended. 
type Req struct {
    Type       int32  `protobuf:"varint,5,opt,name=type" json:"type,omitempty"`
}
 Delete the omitempty of the generated pb.go file 
type Req struct {
    Type       int32  `protobuf:"varint,5,opt,name=type" json:"type"`
}
 so OK 
  cannot be achieved directly in the proto protocol definition file 
 
 solve your problem in a word. 
 Google.Protobuf.JsonFormatter.Settings.Default.WithFormatDefaultValues(true);
The value false or true in 
 represents whether to generate a serialized string for the default value. By default, no serialization string is generated. 
 18 years' question, but if you see it, give a simple answer. This problem occurs because  protoc  generates code that adds  omitempty  to  json tag , so we use  protoc-go-inject-tag . 
< H2 > install < / H2 >
go get -u github.com/favadi/protoc-go-inject-tag
< H2 > use < / H2 >
message UserInfo{
    // @inject_tag: json:"is_auth"
    bool IsAuth = 1;
    // @inject_tag: json:"name"
    string Name = 2;
}
 generate pb files using  protoc  
protoc --go_out=. user.proto
 run  protoc-go-inject-tag  
protoc-go-inject-tag -input=./user.pb.go
 similarly, you can also use other tag if you want to change it.