【发布时间】:2020-12-12 03:51:00
【问题描述】:
我想将我的 protobuf 的消息对象转换为 json 以保存/加载到 redis。 但是 oneof 字段没有按预期工作。
- test.proto
一个简单的例子。
syntax = "proto3";
message example {
oneof test {
bool one = 1;
bool two = 2;
}
}
- 生成文件
如何将 protobuf 代码构建到 golang 中。
.PHONY: proto
proto:
protoc -Iproto/ -I/usr/local/include \
-I$(GOPATH)/src \
-I$(GOPATH)/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/ \
--go_out=plugins=grpc:proto \
proto/test.proto
- main.go
我如何编组/解组我的示例对象。
package main
import (
"encoding/json"
"fmt"
pb "test/proto"
)
func main() {
fmt.Println()
obj := pb.Example{Test: &pb.Example_One{true}}
fmt.Println(obj)
fmt.Println("before one: ", obj.GetOne())
fmt.Println("before two: ", obj.GetTwo())
jsonData, _ := json.Marshal(obj)
fmt.Println(string(jsonData))
fmt.Println("-----")
obj2 := pb.Example{}
_ = json.Unmarshal(jsonData, &obj2)
fmt.Println(obj2)
fmt.Println("after one: ", obj2.GetOne())
fmt.Println("after two: ", obj2.GetTwo())
}
那么,结果是
$ go run main.go
{{{} [] [] <nil>} 0 [] 0xc0000141a0}
before one: true
before two: false
{"Test":{"One":true}}
-----
{{{} [] [] <nil>} 0 [] <nil>}
after one: false
after two: false
有人知道原因吗?
【问题讨论】:
-
使用protojson package:“这个包产生的输出与标准的'encoding/json'包不同,后者不能在协议缓冲区消息上正确运行。”
标签: json go protocol-buffers