json 与 protobuf.any 互转

4 篇文章 0 订阅
2 篇文章 0 订阅

最近用到加载配置文件为 protobuf 的功能,因为多配置,需要使用protobuf.any功能。

问题:写好json后,json 中的内容对应 protobuf.any 的部分无法正常解析

网上搜索许久,最后还是鼓哥给力,一下找到了结果。

解决方法:protobuf.any的实现原理为封装的protobuf.message转换的串+此message的类型(即type)
因此,官方的方案很直接,在对应protobuf.any部分的json串,添加一个json项@type,内容为type.googleapis.dev/module.class.name

示例代码:
test.proto 文件:

package module;
import "google/protobuf/any.proto";
message A {
  int32 val = 1;
}

message B {
  string text = 1;
  google.protobuf.Any data = 2;
}

实现代码:

#include <iostream>
#include <string>
#include <google/protobuf/util/json_util.h>
#include "test.pb.h"
int main(){
  module::A a;
  a.set_val(3);
  module::B b;
  *b.mutable_text() = std::string("abc");
  b.mutable_data()->PackFrom(a);

  std::string json;
  std::cout<<"input:"<<std::endl;
  auto status = google::protobuf::util::MessageToJsonString(b, &json);
  std::cout << json << std::endl;
  
  std::cout<<"output:"<<std::endl;
  module::A a2;
  module::B b2;
  google::protobuf::util::JsonStringToMessage(json, &b2);
  std::cout << "B.text: " << b2.text() << std::endl;
  if (b2.data().Is<cargo::prediction::proto::TestA>()) {
    if (b2.data().UnpackTo(&a2))
      std::cout << "A.val: " << a2.val() << std::endl;
  }
  return 0;
}

输出:

input :
{“text”:“abc”,“data”:{"@type":“type.googleapis.com/module.A”,“val”:3}}
output :
B.text: abc
A.val: 3

另,对于很常见的类型,比如时长,写json时,也需要写成json.object并添加@type。如

{
@type:"type.googleapis.com/google.protobuf.Duration",
"value":"1.2s"
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值