-
测试环境
- ubuntu16.04 64bit
- protocbuf:3.9.1 (支持json转换需>=3.0.0)
-
协议
syntax = "proto2";message Person{optional string name = 1;optional uint32 age = 2;optional string address = 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; }
-
编译
- 编译协议
protoc --cpp_out=. person.proto
- 编译代码
g++ person.pb.cc demo.cpp -lprotobuf -lpthread -o demo && ./demo
- 编译协议
-
运行结果
pb to json:{"name":"hb","age":20,"address":"sjz"} json to pb: name:HB age:22 address:SJZ