golang中如何protobuf转json
时间: 2023-09-13 17:13:28 浏览: 187
实现protobuf与json的互转
5星 · 资源好评率100%
在 Golang 中将 Protobuf 转换为 JSON 可以使用 `github.com/golang/protobuf/jsonpb` 包中的 `Marshaler` 和 `Unmarshaler` 接口。以下是一个示例代码:
```go
package main
import (
"encoding/json"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
"myproject/pb"
)
func main() {
// 创建一个 Protobuf 消息
msg := &pb.MyMessage{
Id: 1234,
Name: "John Doe",
Email: []string{
"johndoe@example.com",
"johndoe2@example.com",
},
}
// 将 Protobuf 转换为 JSON
marshaller := &jsonpb.Marshaler{}
jsonStr, err := marshaller.MarshalToString(msg)
if err != nil {
panic(err)
}
println(jsonStr)
// 将 JSON 解析为 Protobuf
unmarshaller := &jsonpb.Unmarshaler{}
newMsg := &pb.MyMessage{}
err = unmarshaller.UnmarshalString(jsonStr, newMsg)
if err != nil {
panic(err)
}
// 检查解析后的 Protobuf 是否与原始消息相同
if !proto.Equal(msg, newMsg) {
panic("The unmarshalled message is different from the original one")
}
// 将 JSON 转换为 map[string]interface{}
var dataMap map[string]interface{}
err = json.Unmarshal([]byte(jsonStr), &dataMap)
if err != nil {
panic(err)
}
// 打印 map
println(dataMap)
}
```
在上面的代码中,我们首先创建了一个 `pb.MyMessage` Protobuf 消息。然后,我们使用 `jsonpb.Marshaler` 将该消息转换为 JSON 字符串,并使用 `jsonpb.Unmarshaler` 将该 JSON 字符串解析为一个新的 `pb.MyMessage` 对象。最后,我们还演示了如何将 JSON 字符串转换为 `map[string]interface{}` 类型的对象。
阅读全文