You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:00:10