ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C/C++ protobuf与json互转

2026/9/17 2:20:14 拓冰建站 浏览量
C/C++ protobuf与json互转
  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