2016-01-20 78 views

回答

4

我使用Protobuf 3.3.0,它有一個內置的JSON序列化器和解析器。您可以使用中的2個函數MessageToJsonString()JsonStringToMessage()來使您的C++生成Message對象分別來自JSON和來自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.txttest-protobuf.prototest-protobuf.cpp是在同一個目錄,這裏是編譯和Windows上使用Visual Studio 2017年15和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