C++中protobuf Message与JSON的互相转换

C++中protobuf Message与JSON的互相转换

环境:

protobuf: v27.3(2024-08-01)
abseil: 20240722.0

文章目录

  • C++中protobuf Message与JSON的互相转换
    • 前言
    • 1. 编写通讯录addressbook.proto
    • 2. 编译
    • 3. C++中测试protobuf与json的转换
    • 4. 结果

前言

PB转JSON:Protocol Buffers的Message对象转换为 JSON 格式字符串

JSON转PB:JSON格式字符串解析为 Protocol Buffers 的Message对象

protobuf中可以通过MessageToJsonString和JsonStringToMessage函数完成上述转换。

注意:MessageToJsonString和JsonStringToMessage函数仅支持Message对象,不支持MessageLite对象(后面会介绍MessageLite和JSON的转换)。

1. 编写通讯录addressbook.proto

syntax = "proto3";package com.test;message Person {string name = 1;int32 age = 2;string phone = 3;
}message AddressBook{repeated Person people = 1;
}

2. 编译

protoc -I=. --cpp_out=. addressbook.proto
tree
.
+--- addressbook.pb.cc
+--- addressbook.pb.h
+--- addressbook.proto
+--- protoc.exe

3. C++中测试protobuf与json的转换

main.cpp

#include <iostream>#include <google/protobuf/util/json_util.h> // MessageToJsonString JsonStringToMessage#include "addressbook.pb.h"int main(int argc, char *argv[])
{com::test::AddressBook addressbook1;com::test::Person* person1 = addressbook1.add_people();person1->set_name("xiaoming");person1->set_age(30);person1->set_phone("13012345678");// PB to JSONstd::string result1;google::protobuf::json::MessageToJsonString(addressbook1, &result1);std::cout << "AddressBook From PB - " << result1 << std::endl;// JSON to PBstd::string jsonStr = R"({"people":[{"name":"xiaohong","age":31,"phone":"13112345678"}]})";com::test::AddressBook addressbook2;google::protobuf::json::JsonStringToMessage(jsonStr, &addressbook2);std::string result2;google::protobuf::json::MessageToJsonString(addressbook2, &result2);std::cout << "AddressBook From JSON - " << result2 << std::endl;getchar();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)project(main)include_directories(.) # addressbook.pb.h# protobuf
add_definitions(-DPROTOBUF_USE_DLLS)
include_directories(include)
link_directories(lib)add_executable(${PROJECT_NAME} main.cpp addressbook.pb.cc)target_link_libraries(${PROJECT_NAME} libprotobuf abseil_dll)

目录结构

tree
.
+--- include
+--- lib
+--- addressbook.pb.cc
+--- addressbook.pb.h
+--- addressBook.proto
+--- CMakeLists.txt
+--- main.cpp

4. 结果

AddressBook From PB - {"people":[{"name":"xiaoming","age":30,"phone":"13012345678"}]}
AddressBook From Json - {"people":[{"name":"xiaohong","age":31,"phone":"13112345678"}]}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用R语言进行美国失业率时空分析(包括绘图)

今天写一篇利用R语言&#xff0c;针对面板数据的简单分析与绘图。让我们直接开始把。 一、数据准备 这次的示例数据非常简单&#xff0c;只有一个shp格式的美国区县矢量数据&#xff0c;我们在QGIS中打开数据查看一下它的属性表。事实上我们需要的数据都在属性表的字段中。 二…

单片机几大时钟源

在单片机中&#xff0c;MSI、HSI和HSE通常指的是用于内部晶振配置的不同功能模块&#xff1a; MSI (Master Oscillator System Interface)&#xff1a;这是最低级的一种时钟源管理单元&#xff0c;它控制着最基本的系统时钟&#xff08;SYSCLK&#xff09;&#xff0c;一般由外…

前端开发 之 15个页面加载特效上【附完整源码】

文章目录 一&#xff1a;彩球环绕加载特效1.效果展示2.HTML完整代码 二&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 三&#xff1a;两个圆形加载特效1.效果展示2.HTML完整代码 四&#xff1a;半环加载特效1.效果展示2.HTML完整代码 五&#xff1a;音乐波动加载特效1.效…

介绍常见的图片分类模型与算法

介绍常见的图片分类模型与算法 在机器学习和深度学习的领域中&#xff0c;图片分类任务是一个广泛的应用场景。随着深度学习技术的飞速发展&#xff0c;很多强大的图像分类算法和模型已经被提出&#xff0c;广泛应用于从医疗影像到自动驾驶、从人脸识别到图像检索等多个领域。…

Spring入园须知

序 聊 Spring&#xff0c;先从发展历史谈起&#xff0c;对整个生态有个大致认识&#xff0c;最后再看下 Spring 依赖的基础机制——IoC 和 AOP&#xff0c;就达到入门须知的目的了。毕竟 Spring 太大了&#xff0c;如果把话题扯得太宽泛太细节&#xff0c;很可能会迷失在 Spri…

作品截图_

openstack project create --domain default --description "姓氏" xingopenstack user create --domain default --password-prompt --description "名字" mingziopenstack role create --description "姓名首字母" xmzopenstack role add --pr…

使用API管理Dynadot域名,设置默认域名服务器ip信息

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

【Python】深入探索Python类型检查:掌握 `typing` 模块的高级用法

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着代码复杂度的增加,类型安全性在现代开发中变得尤为重要。Python自3.5引入类型提示(type hints),为开发者提供了静态类型检查的能力,而typing模块则是这一系统的核心。本篇文章深入研究Python的类型提示及…

聚合支付系统官方个人免签系统三方支付系统稳定安全高并发

系统采用fastadmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一-些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置对接! 注意&#xff1a;系统没有配置文档很使用教程&#xff0c;不清楚…

nginx配置笔记

前言 nginx官方文档: https://nginx.org/en/docs/openresty官方文档: https://github.com/openresty/lua-nginx-module一、配置 1. 配置实例 1.1. 80端口转443 server {listen 80 default_server;listen [::]:80 default_server;rewrite ^ https://$http_host$request_uri?…

数字图像稳定DIS介绍目录

之前用OpenCV做过防抖&#xff0c;OpenCV处理时&#xff0c;先处理一遍&#xff0c;再输出视频。二者相差还是挺大的。 前 言.......................................................................................................................................... …

C++动态内存管理 之一

C动态内存管理 之一 std::uninitialized_copystd::uninitialized_movestd::uninitialized_default_construct std::uninitialized_copy template< class InputIt, class NoThrowForwardIt > NoThrowForwardIt uninitialized_copy( InputIt first, InputIt last, NoThrow…

Leetcode62. 不同路径(HOT100)

链接 我的代码&#xff1a; class Solution { public:int uniquePaths(int m, int n) {if(m<1||n<1)return 1;vector<vector<int>> dp(m,vector<int>(n));for(int i 0;i<m;i){for(int j 0;j<n;j){if(!i&&!j)dp[i][j] 0;else if(!i|…

如何使用Apache HttpClient发送带有基本认证的HTTP请求

Apache HttpClient 是一个多功能且强大的Java库&#xff0c;用于处理HTTP请求。 它支持多种认证机制&#xff0c;包括基本认证&#xff08;Basic Authentication&#xff09;。 基本认证是一种简单的认证方案&#xff0c;内置在HTTP协议中&#xff0c;使用用户名和密码来验证…

vue结合canvas动态生成水印效果

在 Vue 项目中添加水印可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;使用 CSS 直接通过 CSS 的 background 属性实现水印&#xff1a; 实现步骤 在需要添加水印的容器中设置背景。使用 rgba 设置透明度&#xff0c;并通过 background-repeat 和 background-size…

S32K324 信息安全开发-Secure Debug原理及其实现

文章目录 前言Secure debug原理LC(Life Cycle)Application debug key/password (ADKP)固定密钥的实现方案一机一密实现方案AUTH_MODE的区别代码实现ADKP写入确认认证方式写入LC总结前言 车载信息安全对于MCU的要求越来越高,debug口作为直接刷写调试程序的通道,对其进行保护是…

iptables之地址转换

1、自定义链 iptables -N hello #在filter表中创建一个自定义链&#xff0c;链名hello,自定义链名可以任意大小写 iptables -E hello happy #修改自定义的链名 iptables -t filter -I happy -s 192.168.206.30 -p icmp -j REJECT #禁止192.168.206.30ping本机 自定义没有策略&a…

【GPT】主要影响代谢的因素

代谢的快慢受到多种因素的影响&#xff0c;包括遗传、生活习惯和健康状况等。以下是主要影响代谢的因素&#xff1a; 1. 年龄 影响&#xff1a;年龄增长会导致基础代谢率&#xff08;BMR&#xff09;逐渐降低&#xff0c;这是因为随着年龄增加&#xff0c;肌肉量减少&#xff…

[241129] Docker Desktop 4.36 发布:企业级管理功能、WSL 2 增强 | Smile v4.0.0 发布

目录 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强Smile v4.0.0 发布&#xff01;Java 机器学习库迎来重大升级 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强 Docker Desktop 4.36 带来了强大的更新&#xff0c;简化了…

C语言标准的演进与应用:C89与C99的比较

C语言自20世纪70年代诞生以来,凭借其强大的灵活性和高效性,成为计算机领域中最重要的编程语言之一。在嵌入式开发、系统编程等领域,C语言更是不可或缺。随着技术的发展和需求的变化,C语言的标准也经历了多次迭代,其中C89和C99是两个经典且具有代表性的版本。 C语言标准历…