Go环境下如何将大小写字段不匹配的JSON反序列化到protobuf
解决方案
你遇到的问题分为两部分,都可以用官方protojson库原生能力解决,不需要引入外部依赖也不需要自定义处理逻辑:
- 编译报错修复
你看到的msg.jobId undefined (type *Message has no field or method jobId, but does have JobId)是Go编译阶段错误,和反序列化逻辑无关。
Go语言要求包外可访问的结构体字段必须大写开头,因此protoc生成的Go Protobuf结构体字段统一为大驼峰格式,你只需要把代码中所有访问该字段的写法从msg.jobId改为msg.JobId即可。 - 反序列化字段匹配配置
官方protojson库默认就支持同时匹配Proto定义的原始字段名、Protobuf标准JSON小驼峰字段名,如果你需要严格和你Proto里定义的字段名对齐避免歧义,可以配置UnmarshalOptions的UseProtoNames参数为true,示例代码如下:
msg := &Message{} opts := protojson.UnmarshalOptions{ UseProtoNames: true, // 严格使用Proto文件中定义的字段名匹配JSON key } err := opts.Unmarshal([]byte(MessageData), msg) if err != nil { // 错误处理逻辑 } // 正常访问解析后的字段 fmt.Println(msg.JobId)
补充说明
和Pythongoogle.protobuf.json_format.Parse的能力对齐,Go官方protojson的反序列化默认就兼容Proto原始字段名、标准JSON命名两种格式,绝大多数场景下不需要额外配置也能正常解析你给出的{"jobId": "abc"}格式输入。
内容的提问来源于stack exchange,提问作者maininformer
相关产品推荐
相关产品推荐

