协议缓冲区3和json

时间:2016-01-20 17:12:58

标签: c++ json protocol-buffers proto3

协议缓冲区v3声称,该库是json友好的(https://developers.google.com/protocol-buffers/docs/proto3#json),但我找不到如何实现获取该映射。我应该在protoc中添加一些插件或一些选项,还是调用一些特殊的东西而不是SerializeTo / ParseFrom?

是否有人使用该功能?

2 个答案:

答案 0 :(得分:12)

我正在使用Protobuf 3.3.0,它有一个内置的JSON序列化器和解析器。您可以使用名为google/protobuf/util/json_util.hMessageToJsonString()的{​​{1}}中的两个函数来使您的C ++生成的JsonStringToMessage()对象分别来往和来自JSON。

这是一个使用它们的简单测试: Message

test-protobuf.proto

syntax = "proto3"; message SearchRequest { string query = 1; int32 page_number = 2; int32 result_per_page = 3; }

test-protobuf.cpp

您可以使用以下#include <iostream> #include <google/protobuf/util/json_util.h> #include "test-protobuf.pb.h" int main() { std::string json_string; SearchRequest sr, sr2; // Populate sr. sr.set_query(std::string("Hello!")); sr.set_page_number(1); sr.set_result_per_page(10); // Create a json_string from sr. google::protobuf::util::JsonPrintOptions options; options.add_whitespace = true; options.always_print_primitive_fields = true; options.preserve_proto_field_names = true; MessageToJsonString(sr, &json_string, options); // Print json_string. std::cout << json_string << std::endl; // Parse the json_string into sr2. google::protobuf::util::JsonParseOptions options2; JsonStringToMessage(json_string, &sr2, options2); // Print the values of sr2. std::cout << sr2.query() << ", " << sr2.page_number() << ", " << sr2.result_per_page() << std::endl ; return 0; } 文件(在Windows上测试)编译这些文件(假设您已安装了protobuf,编译器和CMake)。

CMakeLists.txt

假设cmake_minimum_required(VERSION 3.8) project(test-protobuf) find_package(Protobuf REQUIRED) # Use static runtime for MSVC if(MSVC) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag_var} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endif(${flag_var} MATCHES "/MD") endforeach(flag_var) endif(MSVC) protobuf_generate_cpp(test-protobuf-sources test-protobuf-headers "${CMAKE_CURRENT_LIST_DIR}/test-protobuf.proto" ) list(APPEND test-protobuf-sources "${CMAKE_CURRENT_LIST_DIR}/test-protobuf.cpp" ) add_executable(test-protobuf ${test-protobuf-sources} ${test-protobuf-headers}) target_include_directories(test-protobuf PUBLIC ${PROTOBUF_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(test-protobuf ${PROTOBUF_LIBRARIES} ) CMakeLists.txttest-protobuf.proto位于同一目录中,以下是使用Visual Studio 15 2017和64位protobuf在Windows上编译和运行它们的命令库。

test-protobuf.cpp

您应该看到以下输出:

mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" ..
cmake --build . --config Release
Release/test-protobuf

答案 1 :(得分:1)

Protobuf为C#提供了json api。在google protobuf reference中有一些用于C#的json类,你可以在github protobuf repository中找到java和c ++的一些测试。