首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用json存储协议缓冲区的“一个”字段

如何用json存储协议缓冲区的“一个”字段
EN

Stack Overflow用户
提问于 2020-08-23 09:08:47
回答 1查看 3.6K关注 0票数 4

我想要我的protobuf的消息对象json保存/加载到redis。但其中一个领域不像预期的那样工作。

  • test.proto

简单的例子。

代码语言:javascript
复制
syntax = "proto3";

message example {
    oneof test {
        bool one = 1;
        bool two = 2;
    }
}
  • Makefile

如何将原始代码构建为golang。

代码语言:javascript
复制
.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

我如何封送/解封我的示例对象。

代码语言:javascript
复制
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())
}

然后,结果是

代码语言:javascript
复制
$ 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

有人知道原因吗?

EN

回答 1

Stack Overflow用户

发布于 2020-08-23 13:56:32

多亏了彼得,我才能把我的信息编码给json。

原生文件

  • 我的原型环境
代码语言:javascript
复制
// versions:
//  protoc-gen-go v1.25.0-devel
//  protoc        v3.6.

我的答案代码

代码语言:javascript
复制
package main

import (
    "fmt"
    pb "test/proto"

    "google.golang.org/protobuf/encoding/protojson"
)

func main() {
    obj := pb.Example{Test: &pb.Example_One{true}}
    fmt.Println(obj)
    fmt.Println("before one: ", obj.GetOne())
    fmt.Println("before two: ", obj.GetTwo())

    jsonData, _ := protojson.Marshal(&obj)
    fmt.Println(string(jsonData))
    fmt.Println("-----")

    obj2 := pb.Example{}
    _ = protojson.Unmarshal(jsonData, &obj2)
    fmt.Println(obj2)
    fmt.Println("after one: ", obj2.GetOne())
    fmt.Println("after two: ", obj2.GetTwo())
}

和结果

代码语言:javascript
复制
$ go run main.go
{{{} [] [] <nil>} 0 [] 0xc0000141cc}
before one:  true
before two:  false
{"one":true}
-----
{{{} [] [] 0xc0001203c0} 0 [] 0xc000014253}
after one:  true
after two:  false
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63545226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档