Go语言gRPC服务中google.protobuf.BoolValue反序列化失败求助
解决gRPC中google.protobuf.BoolValue反序列化失败问题
问题原因
你遇到的错误是因为gRPC的JSON解析器默认将google.protobuf.BoolValue类型映射为原生布尔值,而非嵌套的{"value": bool}对象结构。当你传入嵌套对象时,解析器无法将其转换为预期的类型,从而抛出错误。
解决方案
方法1:修改grpcurl请求格式(推荐)
直接将married字段的值设为原生布尔值,符合Protobuf JSON标准映射:
grpcurl -plaintext -d '{"phone": 9998887776, "married": false}' localhost:50051 user.UserService/SearchUsers
方法2:验证生成的Protobuf代码
检查你的pb/user.pb.go文件中,SearchCriteria结构体的Married字段是否正确生成为*wrapperspb.BoolValue类型:
type SearchCriteria struct { // ... 其他字段 Married *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=married,proto3" json:"married,omitempty"` }
如果字段类型错误,说明你使用的protoc-gen-go版本可能存在问题,建议更新到最新版本重新生成代码:
protoc --go_out=. --go-grpc_out=. user.proto
方法3:启用宽松JSON解析(可选)
如果需要兼容嵌套对象格式的请求,可以在gRPC服务器中配置JSON解析器的宽松模式。在处理请求时,使用protojson.UnmarshalOptions来允许两种格式:
import "google.golang.org/protobuf/encoding/protojson" // 示例:在自定义拦截器中配置 func jsonInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { opts := protojson.UnmarshalOptions{ AllowPartial: true, DiscardUnknown: true, UseProtoNames: true, } // ... 自定义解析逻辑 return handler(ctx, req) }
不过这种方式较为复杂,通常推荐直接使用标准的原生布尔值格式。
验证
修改请求格式后,你的服务端代码中in.Married != nil的判断逻辑会正常工作:当传入false时,in.Married会被初始化为&wrapperspb.BoolValue{Value: false},进而执行对应的SQL查询条件。
内容的提问来源于stack exchange,提问作者Sahil Sojitra
相关产品推荐
相关产品推荐

