C/C++ protobuf与json互转

本文详细介绍了在Ubuntu16.0464位系统中使用Protobuf3.9.1进行协议转换,包括从ProtoBuf消息到JSON和从JSON到ProtoBuf的示例代码,以及版本要求和编译过程。
摘要由CSDN通过智能技术生成
  1. 测试环境

    • ubuntu16.04 64bit
    • protocbuf:3.9.1 (支持json转换需>=3.0.0)
  2. 协议

    syntax = "proto2";
    
    message Person{
    	optional string name = 1;
    	optional uint32 age = 2;
    	optional string address = 3;
    }
    
    
  3. 测试代码

    //protobuf >= 3.0.0
    
    #include "person.pb.h"
    #include "google/protobuf/stubs/stringpiece.h"
    #include "google/protobuf/util/json_util.h"
    #include <iostream>
    
    bool proto_to_json(const google::protobuf::Message& message, std::string& json) {
        google::protobuf::util::JsonPrintOptions options;
        // options.add_whitespace = true;
        return MessageToJsonString(message, &json, options).ok();
    }
    
    bool json_to_proto(const std::string& json, google::protobuf::Message& message) {
        google::protobuf::util::JsonParseOptions options;
        return JsonStringToMessage(json, &message, options).ok();
    }
    
    int main(int argc, char* argv[]){
        std::string person_json;
    
        Person person;
        person.set_name("hb");
        person.set_age(20);
        person.set_address("sjz");
    
        if (!proto_to_json(person, person_json)) {
            std::cout << "pb to json failed!" << std::endl;
        }else{
            std::cout << "pb to json:" << person_json << std::endl;
        }
    
        person.Clear();
        person_json.clear();
        person_json = "{\"name\": \"HB\", \"age\": 22, \"address\": \"SJZ\" }";
        if (!json_to_proto(person_json, person)) {
            std::cout << "json to pb failed!" << std::endl;
        }else{
            std::cout << "json to pb: name:" << person.name() << " age:" << person.age() << " address:" << person.address() << std::endl;
        }
        return 0;
    }
    
    
  4. 编译

    • 编译协议
      protoc --cpp_out=. person.proto 
      
    • 编译代码
      g++ person.pb.cc demo.cpp -lprotobuf -lpthread -o demo && ./demo
      
  5. 运行结果

    pb to json:{"name":"hb","age":20,"address":"sjz"}
    json to pb: name:HB age:22 address:SJZ
    
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用第三方库,如protobuf-json-util来实现C++JSONProtobuf的功能。个库提供了一些方便的函数和接口,可以帮助你在ProtobufJSON之间进行换。 首先,你需要在你的C++项目中引入protobuf-json-util库。你可以在GitHub上找到该库的源代码并进行下载和安装。 然后,你需要定义你的Protobuf消息和相应的JSON格式。在Protobuf中,你可以使用.proto文件定义消息结构,在JSON中,你可以使用类似的结构来表示相同的数据。 接下来,你可以使用protobuf-json-util库提供的函数来实现JSONProtobuf换。你可以使用`ParseFromJsonString()`函数将JSON字符串解析为Protobuf消息对象,使用`SerializeToJsonString()`函数将Protobuf消息对象序列化为JSON字符串。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <string> #include <protobuf-json-util/json_util.h> #include "your_protobuf_message.pb.h" int main() { // 定义一个Protobuf消息对象 YourProtobufMessage message; // 从JSON字符串解析Protobuf消息对象 std::string json = R"( { "field1": 123, "field2": "hello", "field3": true } )"; json_util::Status status = json_util::ParseFromJsonString(json, &message); if (!status.ok()) { std::cerr << "Failed to parse JSON: " << status.error_message() << std::endl; return 1; } // 将Protobuf消息对象序列化为JSON字符串 std::string serialized_json = json_util::SerializeToJsonString(message); std::cout << "Serialized JSON: " << serialized_json << std::endl; return 0; } ``` 请确保按照protobuf-json-util库的文档进行正确的安装和配置,并根据你的实际需求修改示例代码中的消息类型和字段名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值