Протокол buffer3 и JSON

Буфер протокола v3 утверждает, что библиотека является дружественной к json (https://developers.google.com/protocol-buffers/docs/proto3#json), но я не могу найти, как добиться этого отображения. Должен ли я добавить какой-нибудь плагин или какой-либо параметр в protoc или вызвать что-то особенное вместо SerializeTo / ParseFrom?

Это кто-то, кто использует эту функцию?

8

Решение

Я использую Protobuf 3.3.0, который имеет встроенный сериализатор JSON и парсер. Вы можете использовать 2 функции из google/protobuf/util/json_util.h называется MessageToJsonString() а также JsonStringToMessage() заставить ваш C ++ генерировать Message объекты идут в и из JSON соответственно.

Вот простой тест, который использует их:
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;
}

Вы можете скомпилировать эти файлы (при условии, что у вас установлены protobuf, компилятор и CMake) с помощью следующего CMakeLists.txt файл (проверено на Windows).

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.txt, test-protobuf.proto, а также test-protobuf.cpp находятся в том же каталоге, здесь приведены команды для их компиляции и запуска в Windows с Visual Studio 15 2017 и 64-битными библиотеками protobuf.

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

Вы должны увидеть следующий вывод:

{
"query": "Hello!",
"page_number": 1,
"result_per_page": 10
}

Hello!, 1, 10
8

Другие решения

Protobuf имеет JSON API для C #. Есть несколько классов JSON для C # в Справочник по Google Protobuf и вы можете найти некоторые тесты в Github Protobuf хранилище для Java и C ++.

1

По вопросам рекламы [email protected]