C++基于rapidjson的Json与结构体互相转换

news2025/4/17 7:15:23

简介

使用rapidjson库进行封装,实现了使用C++对结构体数据和json字符串进行互相转换的功能。最短只需要使用两行代码即可无痛完成结构体数据转换为Json字符串。

支持std::string、数组、POD数据(int,float,double等)、std::vector、嵌套结构体,容器内放结构体等。

优点

1、代码轻量级;仅需引入rapidjson库以及三个头文件即可完成;

2、操作简单;仅需在结构体声明位置注册结构体类型和成员变量;使用时使用提供的序列化和反序列化类接口即可完成转化;使用成员变量名为Json的Key值。

使用示例:

#pragma once
#include <vector>
#include "JsonStructPackage/JsonStructPackageHeader.h"

struct TestStructQQQ
{
	int32_t intTest;
	short shortTest;
	long longTest;
	long long longLongTest;

	float floatTest;
	int32_t unsignedIntTest;

	double doubleTest;

	unsigned long long unsignedLongLongTest;

	std::string tsttr;
};
JSONTRANSLATE(TestStructQQQ, intTest
	, shortTest
	, longTest
	, longLongTest
	, floatTest
	, unsignedIntTest
	, doubleTest
	, unsignedLongLongTest
	, tsttr
	);

struct TestStructA
{
	int32_t ab;
	std::string str;
	double doubleValue;
	float floatValue;

	TestStructQQQ qqq;
	char testChar[64];

	std::vector<TestStructQQQ> testVectorStruct;
	std::vector<int32_t> testVectorInt;
	std::vector<std::string> testVectorStr;

	TestStructA()
	{
		memset(testChar, 0, sizeof(testChar));
	}
};
JSONTRANSLATE(TestStructA, ab
	, str
	, doubleValue
	, floatValue
	, qqq
	, testChar
	, testVectorStruct, testVectorInt, testVectorStr
	);


int32_t main(int32_t argc, char* argv[])
{
	TestStructQQQ testQQQ;

	testQQQ.intTest = 999;
	testQQQ.shortTest = 32765;
	testQQQ.longTest = 65536789;
	testQQQ.longLongTest = 665565345;
	testQQQ.floatTest = 12345.4567;
	testQQQ.unsignedIntTest = 7678;
	testQQQ.doubleTest = 456.67867876;
	testQQQ.unsignedLongLongTest = 1232345678;

	testQQQ.tsttr = "This is TestString!哈哈";

	TestStructA testStruct;
	testStruct.ab = 99;

	testStruct.doubleValue = 123.652432;
	testStruct.floatValue = 99.987;
	testStruct.str = "This is a String";

	testStruct.qqq = testQQQ;

	testStruct.testVectorStruct.emplace_back(testQQQ);
	testStruct.testVectorStruct.emplace_back(testQQQ);

	testStruct.testVectorInt.emplace_back(99);
	testStruct.testVectorInt.emplace_back(55);

	testStruct.testVectorStr.emplace_back("String1");
	testStruct.testVectorStr.emplace_back("String2");

	testStruct.testChar[0] = 'T';
	testStruct.testChar[1] = 'E';
	testStruct.testChar[2] = 'S';
	testStruct.testChar[3] = 'T';

    /**************核心-结构体转Json****************************/
	JsonStructPackager jsonPackage;
	jsonPackage << testStruct;
	std::string resJson = jsonPackage.data();
    /**************核心-结构体转Json****************************/

    /**************核心-Json转结构体****************************/
	JsonStructUnpackager jsonUnpackage(resJson);
	TestStructA unpackageStruct;
	jsonUnpackage >> unpackageStruct;
    /**************核心-Json转结构体****************************/

	return 0;
}

resJson输出如下(经过json格式化后的,直接输出是一个没有换行的字符串):

resJson : {
    "ab": 99,
    "str": "This is a String",
    "doubleValue": 123.652432,
    "floatValue": 99.98699951171875,
    "qqq": {
        "intTest": 999,
        "shortTest": 32765,
        "longTest": 65536789,
        "longLongTest": 665565345,
        "floatTest": 12345.45703125,
        "unsignedIntTest": 7678,
        "doubleTest": 456.67867876,
        "unsignedLongLongTest": 1232345678,
        "tsttr": "This is TestString!哈哈"
    },
    "testChar": "TEST",
    "testVectorStruct": [
        {
            "intTest": 999,
            "shortTest": 32765,
            "longTest": 65536789,
            "longLongTest": 665565345,
            "floatTest": 12345.45703125,
            "unsignedIntTest": 7678,
            "doubleTest": 456.67867876,
            "unsignedLongLongTest": 1232345678,
            "tsttr": "This is TestString!哈哈"
        },
        {
            "intTest": 999,
            "shortTest": 32765,
            "longTest": 65536789,
            "longLongTest": 665565345,
            "floatTest": 12345.45703125,
            "unsignedIntTest": 7678,
            "doubleTest": 456.67867876,
            "unsignedLongLongTest": 1232345678,
            "tsttr": "This is TestString!哈哈"
        }
    ],
    "testVectorInt": [
        99,
        55
    ],
    "testVectorStr": [
        "String1",
        "String2"
    ]
}

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

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

相关文章

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系 OpenStack的安全组&#xff08;Security Group&#xff09;默认是通过Linux的iptables实现的。以下是其主要实现原理和机制&#xff1a; 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…

通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元

通义万相2.1图生视频大模型 通义万相2.1图生视频技术架构万相2.1的功能特点性能优势与其他工具的集成方案 蓝耘平台部署万相2.1核心目标典型应用场景未来发展方向 通义万相2.1ALGC实战应用操作说明功能测试 为什么选择蓝耘智算蓝耘智算平台的优势如何通过API调用万相2.1 写在最…

52.个人健康管理系统小程序(基于springbootvue)

目录 1.系统的受众说明 2.开发环境与技术 2.1 MYSQL数据库 2.2 Java语言 2.3 微信小程序技术 2.4 SpringBoot框架 2.5 B/S架构 2.6 Tomcat 介绍 2.7 HTML简介 2.8 MyEclipse开发工具 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作…

学习比较JVM篇(六):解读GC日志

一、前言 在之前的文章中&#xff0c;我们对JVM的结构、垃圾回收算法、垃圾回收器做了一些列的讲解&#xff0c;同时也使用了JVM自带的命令行工具进行了实际操作。今天我们继续讲解JVM。 我们学习JVM的目的是为了了解JVM&#xff0c;然后优化对应的参数。那么如何了解JVM运行…

I²S协议概述与信号线说明

IIS协议概述 ​ IS&#xff08;Inter-IC Sound&#xff09;协议&#xff0c;又称 IIS&#xff08;Inter-IC Sound&#xff09;&#xff0c;是一种专门用于数字音频数据传输的串行总线标准&#xff0c;由飞利浦&#xff08;Philips&#xff09;公司提出。该协议通常用于微控制器…

免费Deepseek-v3接口实现Browser-Use Web UI:浏览器自动化本地模拟抓取数据实录

源码 https://github.com/browser-use/web-ui 我们按照官方教程&#xff0c;修订几个环节&#xff0c;更快地部署 步骤 1&#xff1a;克隆存储库 git clone https://github.com/browser-use/web-ui.git cd web-ui Step 2: Set Up Python Environment 第 2 步&#xff1a;设置…

[蓝桥杯] 求和

题目链接 P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷 题目理解 这道题就是公式题&#xff0c;我们模拟出公式后&#xff0c;输出最终结果即可。 本题不难&#xff0c;相信很多同学第一次见到这道题都是直接暴力解题。 两个for循环&#xff0c;测试样例&#xff0c;直接拿下。 #in…

通过Ollama本地部署DeepSeek R1模型(Windows版)

嗨&#xff0c;大家好&#xff0c;我是心海 以下是一份详细的Windows系统下通过Ollama本地部署DeepSeek R1模型的教程&#xff0c;内容简洁易懂&#xff0c;适合新手用户参考 本地部署大模型&#xff0c;就有点像在你自己的电脑或者服务器上&#xff0c;安装并运行这样一个“私…

【C++】vector的底层封装和实现

目录 目录前言基本框架迭代器容量第一个测试&#xff0c;野指针异常第二轮测试&#xff0c;浅拷贝的问题 元素访问修改操作push_backinsert迭代器失效问题 erase 默认成员函数构造函数双重构造引发调用歧义 拷贝构造赋值重载析构函数 源码end 目录 前言 废话不多说&#xff0…

Open CASCADE学习|读取点集拟合样条曲线(续)

问题 上一篇文章已经实现了样条曲线拟合&#xff0c;但是仍存在问题&#xff0c;Tolerance过大拟合成直线了&#xff0c;Tolerance过大头尾波浪形。 正确改进方案 1️⃣ 核心参数优化 通过调整以下参数控制曲线平滑度&#xff1a; Standard_Integer DegMin 3; // 最低阶…

【Django】教程-11-ajax弹窗实现增删改查

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…

R语言:气象水文领域的数据分析与绘图利器

R 语言是一门由统计学家开发的用于统计计算和作图的语言&#xff08;a Statistic Language developed for Statistic by Statistician&#xff09;&#xff0c;由 S 语言发展而来&#xff0c;以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…

图形化编程语言:低代码赛道的技术革命与范式突破

在 2024 年 Gartner 低代码平台魔力象限报告中&#xff0c;传统低代码厂商市场份额增速放缓至 12%&#xff0c;而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈&#xff0c;系统阐释图形化编程语言的核心优势&#xff0c;揭示其如何重构软件开发范…

蓝桥杯每日刷题c++

目录 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 (luogu.com.cn) P8748 [蓝桥杯 2021 省 B] 时间显示 - 洛谷 (luogu.com.cn) P10900 [蓝桥杯 2024 省 C] 数字诗意 - 洛谷 (luogu.com.cn) P10424 [蓝桥杯 2024 省 B] 好数 - 洛谷 (luogu.com.cn) P8754 [蓝桥杯 2021 省 AB2…

arthas之dump/classloader命令的使用

文章目录 1. dump2. classloader 1. dump 作用&#xff1a;将已加载类的字节码文件保存到特定目录&#xff1a;logs/arthas/classdump/ 参数 数名称参数说明class-pattern类名表达式匹配[c:]类所属 ClassLoader 的 hashcode[E]开启正则表达式匹配&#xff0c;默认为通配符匹…

第一次3D打印,一个简单的小方块(Rhino)

一、建模 打开犀牛&#xff0c;我们选择立方体 我们点击上册的中心点 输入0&#xff0c;然后回车0 而后我们输长度&#xff1a;10&#xff0c;回车确认 同样的&#xff0c;宽度10 高度同样是10 回车确认后&#xff0c;我们得到一个正方形 二、导出模型 我们选择文件—>保存…

VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr

手把手虚拟机安装苹果操作系统 VMware_workstation_full_12.5.2 unlocker208 Apple Max OS X(M&#xff09;-CSDN博客 vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1180 FILE: FileCreateDirectoryRetry: Non-retriable error encountered (C:\ProgramData\VMware): Cann…

[ctfshow web入门] web16

信息收集 提示&#xff1a;对于测试用的探针&#xff0c;使用完毕后要及时删除&#xff0c;可能会造成信息泄露 试试url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 点击phpinfo&#xff0c;查看phpinfo信息&#xff0c;搜索flag&#xff0c;发现flag被保存为变量…

全面支持MCP协议,开启便捷连接之旅,MaxKB知识库问答系统v1.10.3 LTS版本发布

2025年4月7日&#xff0c;MaxKB开源知识库问答系统正式发布v1.10.3 LTS版本。 在MaxKB v1.10.3 LTS版本中&#xff0c;应用方面&#xff0c;MaxKB新增支持MCP调用节点&#xff0c;AI对话节点新增MCP工具调用功能&#xff0c;支持设置MCP服务配置&#xff1b;函数库方面&#x…