C++ JSON库:JSON for Morden C++

绪论

最近因为项目的需要,需要对JSON进行一定的数据处理,因为想要用C++进行编码,便对C++的JSON库进行的调研,发现这个库比较好用:JSON for Morder C++。

使用指南

想要使用这个json库,只需要在源文件中包含json.hpp头文件,然后就可以使用nlohmann::json对象啦,非常地简单,不需要添加动态库什么的。

序列化

测试代码

void test_json_serialization() {using json = nlohmann::json;json js;js["msg_type"] = 2; //值可以是任意内置类型js["from"] = "zhang san";js["to"] = "li si";js["msg"] = "Hello, how are you?";js["id"] = {1, 2, 3, 4, 5}; //值可以是数组js["msg1"]["zhang san"] = "I am zhang san";js["msg1"]["li si"] = "I am li si";//等价于下面的写法,支持对同一个键值重复写入js["msg1"] = {{"zhang san", "I am zhang san"}, {"li si", "I am li si"}};//支持直接用容器给json赋值,json对象指向一个数组js["list"] = std::vector<int>{1,2,3};//如果给json赋值map对象,不会产生map对象,而是产生一个数组//每个数组的元素仍然是一个子数组,这个子数组中有两个元素,分别是map对象的键和值js["path1"] = std::map<int,std::string>{{1,"map1"}, {2,"map2"}};js["path2"] = std::unordered_map<int,std::string>{{1,"unordered_map1"}, {2,"unordered_map2"}};std::string s = js.dump();  //转储成字符串 可以使用dump(4)进行缩进edward::print(s);
}

运行结果

{“from”:“zhang san”,
“id”:[1,2,3,4,5],
“list”:[1,2,3],
“msg”:“Hello, how are you?”,
“msg1”:{“li si”:“I am li si”,“zhang san”:“I am zhang san”},
“msg_type”:2,
“path1”:[[1,“map1”],[2,“map2”]],
“path2”:[[2,“unordered_map2”],[1,“unordered_map1”]],
“to”:“li si”}

反序列化

测试代码

void test_json_deserialization(const std::string& buf) {using json = nlohmann::json;json js = json::parse(buf);edward::print("msg_type:", js["msg_type"]);edward::print("from:", js["from"]);edward::print("to:", js["to"]);edward::print("msg:", js["msg"]);edward::print("id:", js["id"]);edward::printArr(js["id"].begin(), js["id"].end());edward::print("msg1:", js["msg1"]);edward::print("msg1[\"zhang san\"]:", js["msg1"]["zhang san"]);std::vector<int> list = js["list"];std::map<int, string> path1 = js["path1"];std::unordered_map<int, string> path2 = js["path2"];edward::printArr(list);edward::printArr(path1);edward::printArr(path2);
}

运行结果

msg_type: 2
from: “zhang san”
to: “li si”
msg: “Hello, how are you?”
id: [1,2,3,4,5]
1 2 3 4 5
msg1: {“li si”:“I am li si”,“zhang san”:“I am zhang san”}
msg1[“zhang san”]: “I am zhang san”
1 2 3
1 map1 2 map2
1 unordered_map1 2 unordered_map2

其中的print函数和printArr函数都放在我自己的一个工具库中。详见我的博客C++ 工具函数库
如果还想了解更多的细节可以去github上学习更多内容。

源码解析

看到一个大神对这个库实现细节的解析,最近也恰好在学习模板,插个眼,我以后也研究一下这个库的源码:C++ 常用库 —— JSON for Modern C++

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

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

相关文章

Linux信号实现精确到微秒的sleep函数:通过sigsuspend函数解决时序竞态问题

原理就是先使用定时器定时&#xff0c;然后再使用pause函数或者sigsuspend函数主动阻塞挂起&#xff0c;最终恢复现场。 如果使用pause函数的话&#xff0c;优点是使用简单&#xff0c;缺点是有可能产生时序竞态&#xff0c;导致进程一直阻塞下去&#xff1a;在定时和挂起之间…

Linux创建多个子进程并通过捕获SIGCHLD信号进行非阻塞回收

我们通过fork函数创建多个子进程&#xff0c;并通过exec函数族在子进程中进行其他的工作&#xff0c;但是为了避免僵尸进程&#xff0c;我们要对子进程进行回收。常用的回收方式是wait或者waitpid进行阻塞回收&#xff0c;因为如果非阻塞回收很难把握时机&#xff0c;而阻塞回收…

Linux创建守护进程

守护进程&#xff08;Daemon&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过…

Linux创建多个子线程并回收

创建子线程的逻辑相比子进程要更容易理解一些&#xff0c;因为线程没有像进程那样复制很多东西另起炉灶&#xff0c;子线程从传入的开始函数开始运行&#xff0c;但是难点在于传入参数和回收时获取退出状态&#xff0c;因为这两个原本都是void *类型的&#xff0c;而我们在使用…

Qt发布程序

Windows&#xff1a; https://www.cnblogs.com/linuxAndMcu/p/10974927.html Ubuntu&#xff1a; https://blog.csdn.net/u014779536/article/details/107854060

K210入门

之前购买了一个Sipeed Maix M1w Dock k210的开发板&#xff0c;想着自己鼓捣鼓捣&#xff0c;在网上看到了一些好的教程&#xff0c;在这里记录一下&#xff1a; 嵌入式AI从入门到放肆【K210篇】-- 硬件与环境&#xff1a;介绍了各种开发环境的搭建&#xff0c;但是不是特别详细…

C++输入输出:cin/cout 还是 scanf/printf?

相信使用C的人都有一种迷惑或者是不自信&#xff1a;在输入输出的时候是不是应该使用scanf/printf更好呢&#xff0c;因为传说cin/cout龟速&#xff0c;我当时也长期被这个所困扰&#xff0c;后来在阅读C primer第五版的时候我自己做了一个测试&#xff0c;发现如果不使用std::…

UVA - 101:The Blocks Problem

原本以为是一道很简单的模拟题&#xff0c;结果写了一个小时。。。很长时间不碰算法题&#xff0c;的确手感差很多。不过我觉得随着刷题慢慢多起来应该会好的。 题目的意思也有点含糊&#xff0c;需要自己去猜&#xff0c;大概意思就是槽里有一堆木头&#xff0c;每个槽刚开始…

UVA - 12096:The SetStack Computer

题目描述很简单&#xff0c;难点在于如何对集合进行编码&#xff0c;因为是无限的&#xff0c;好像没有一个方向进行编码。 紫书给的题解十分巧妙&#xff1a;给新出现的集合进行编码 的确&#xff0c;我们没有必要为所有可能出现的集合编码后再开始&#xff0c;我们就可以简单…

UVA - 540:Team Queue

主要的关键在于&#xff1a;不要试图让所有团队的人在一个队列里面&#xff0c;因为这样如果新入队的是一个前面团队的成员则必须先出队再入队。 应该把每个团队看做一个整体&#xff0c;用一个队列维护团队的顺序&#xff0c;用t个队列维护每个团队内部的顺序。 还有就是要维…

UVA-136:Ugly Numbers

很简单的一道题&#xff0c;但是我竟然蠢到想不明白为什么如果从头生成会出现大量重复的数字。 写的时候主要出现的错误在爆int上&#xff0c;一定要注意数据范围。 #include <iostream> #include <queue> #include <set>using namespace std; using ll lo…

类的成员函数可以访问属于该类的任意对象的私有变量

之前在书上看到成员函数可以访问类的私有变量的时候觉得是废话嘛&#xff0c;如果成员函数都不能访问那私有变量不就变成了花瓶了。然而发现自己还是太naive。 这句话的意思是&#xff1a;在类的作用域内&#xff0c;包含成员函数、静态成员函数和友元函数内&#xff0c;可以访…

GMP使用入门

最近写了一个高精度的模板&#xff0c;想要用GMP库测试一下&#xff0c;总结一下GMP环境的搭建。 环境搭建&#xff1a;GMP大法教你重新做人(从入门到实战) 解压.tar.lz的 时候可能会遇到一点问题&#xff0c;可以参考这个博客&#xff1a;.tar.lz压缩包解压 需要注意的是C需要…

UVA - 400:Unix ls

题目的难点在于要求前面的每一列的是最大长度L2&#xff0c;最后一列的长度是L。对于宽度为WIDTH60的一行来说&#xff0c;一行可以放下多少个单词决定了需要多少行&#xff0c;知道了行数才能开始根据行数开始放置。 我的做法是col (WIDTH 2) / (L 2)&#xff0c;即提前给W…

UVA - 1592:Database

题目的意思是找到两行在两列处相等&#xff0c;主要要做的是记录某个值是否重复出现过。 经过思考&#xff0c;我的思路是&#xff1a;每一列用一个unordered_map<string,vector<int>>记录单词出现的行数&#xff0c;对于某一行中的两列&#xff0c;如果有两个元素…

C++ array初始化需要双层大括号

对于array的初始化我们可以使用列表初始化&#xff1a; array<int, 8> test {1,2,3,4,5,6,7,8 };但是当我们不再使用简单的内置类型array时&#xff1a; array<pair<int, int>, 8> dirs {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}…

Qt for Android环境配置

最近想写一个小APP&#xff0c;但是又不想用Android Studio进行开发&#xff0c;想要用C进行开发&#xff0c;听说Qt可以进行Android开发&#xff0c;就想尝试一下&#xff0c;结果花了一天时间来配置环境。。。而且发现windows下配置环境更简单一些&#xff08;我中途还切换到…

UVa-12333:Revenge of Fibonacci 高精度

之前自己仿照紫书上写了高精度库&#xff0c;完善了乘法、减法&#xff0c;并且通过了和C高精度库GMP的对拍测试&#xff0c;并在一些OJ上过了一些高精度的模板题&#xff0c;代码仓库地址&#xff1a;https://github.com/Edward-Elric233/BigInt 求解思路 题目的意思是求前1…

vim命令笔记

vim折叠函数&#xff1a;https://www.cnblogs.com/zlcxbb/p/6442092.html Vim录制宏及使用&#xff1a;https://www.jianshu.com/p/9d999c72a9f3 将vim与系统剪贴板的交互使用&#xff1a;https://zhuanlan.zhihu.com/p/73984381

Educational Codeforces Round 114总结

绪论 https://codeforces.com/contest/1574/ 以前想要打CF&#xff0c;总是觉得没有时间&#xff0c;要做这个&#xff0c;要做那个&#xff0c;现在时间充裕了一些&#xff0c;想要多打一些CF&#xff0c;但是光打比赛不总结是没有什么帮助的&#xff0c;这是我从以前的ACM训…