深入浅出(五)nlohmann/json库

nlohmann/json安装与应用

  • 1. nlohmann/json简介
    • 1.1 nlohmann/json下载
  • 2. C++示例
    • 2.1 应用示例
    • 2.2 封装应用
      • 2.2.1 NLOHMANN_DEFINE_TYPE_INTRUSIVE

1. nlohmann/json简介

优点:

  • 易用性:该库的接口设计非常直观,与 C++ STL 风格非常接近。
  • 单头文件:它是一个单头文件库,只需要将头文件引入项目即可使用。
  • 功能强大:支持从 JSON 格式到 C++ 标准容器(如 std::vector、std::map)的自动转换,支持序列化、反序列化操作。
  • 轻量化:不依赖其他库,且解析速度较快。

缺点:

  • 可能在处理非常大的 JSON 文件时性能不是最优。

1.1 nlohmann/json下载

source地址
GitHubhttps://github.com/nlohmann/json

2. C++示例

2.1 应用示例

#include <nlohmann/json.hpp>
using json = nlohmann::json;int main() {// 解析 JSON 字符串std::string jsonString = R"({"name": "John", "age": 30})";json jsonObj = json::parse(jsonString);// 访问 JSON 对象std::string name = jsonObj["name"];int age = jsonObj["age"];
}
  1. 解析 JSON 字符串
    假设你有一个 JSON 格式的字符串,想要将其解析为 C++ 对象
#include <iostream>
#include <nlohmann/json.hpp>int main() {// JSON 字符串std::string json_str = R"({"name": "Alice","age": 25,"is_student": false,"skills": ["C++", "Python", "JavaScript"]})";// 解析 JSON 字符串为 JSON 对象nlohmann::json json_obj = nlohmann::json::parse(json_str);// 访问 JSON 数据std::string name = json_obj["name"];int age = json_obj["age"];bool is_student = json_obj["is_student"];std::vector<std::string> skills = json_obj["skills"];// 输出结果std::cout << "Name: " << name << "\n";std::cout << "Age: " << age << "\n";std::cout << "Is student: " << (is_student ? "Yes" : "No") << "\n";std::cout << "Skills: ";for (const auto& skill : skills) {std::cout << skill << " ";}std::cout << std::endl;return 0;
}
  1. 生成 JSON 对象
    你可以使用 nlohmann::json 轻松地创建一个 JSON 对象,并将其转换为字符串。
#include <iostream>
#include <nlohmann/json.hpp>int main() {// 创建 JSON 对象nlohmann::json json_obj;json_obj["name"] = "Bob";json_obj["age"] = 30;json_obj["is_student"] = true;json_obj["skills"] = {"Java", "Kotlin", "Swift"};// 转换为字符串std::string json_str = json_obj.dump(4); // 参数 4 表示缩进 4 空格std::cout << json_str << std::endl;return 0;
}
  1. 修改 JSON 数据
    你可以直接对 JSON 对象中的数据进行修改:
#include <iostream>
#include <nlohmann/json.hpp>int main() {// 创建一个初始的 JSON 对象nlohmann::json json_obj = {{"name", "Charlie"},{"age", 22},{"is_student", true},{"skills", {"C#", "Go"}}};// 修改值json_obj["age"] = 23;json_obj["skills"].push_back("Rust");// 输出修改后的 JSONstd::cout << json_obj.dump(4) << std::endl;return 0;
}
  1. 将 JSON 写入文件
    你可以将生成的 JSON 对象保存到文件中,或者从文件中读取 JSON 数据。
#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>int main() {// 创建 JSON 对象nlohmann::json json_obj = {{"name", "Dave"},{"age", 40},{"is_student", false},{"skills", {"PHP", "Ruby"}}};// 将 JSON 写入文件std::ofstream file("data.json");file << json_obj.dump(4); // 缩进 4 个空格file.close();// 从文件读取 JSONstd::ifstream input_file("data.json");nlohmann::json read_json;input_file >> read_json;// 输出读取的 JSONstd::cout << read_json.dump(4) << std::endl;return 0;
}
  1. 遍历 JSON 对象
    你可以迭代遍历 nlohmann::json 对象来访问其键值对。
#include <iostream>
#include <nlohmann/json.hpp>int main() {// 创建 JSON 对象nlohmann::json json_obj = {{"name", "Eve"},{"age", 28},{"is_student", false},{"skills", {"Scala", "Haskell", "Elixir"}}};// 遍历 JSON 对象for (auto it = json_obj.begin(); it != json_obj.end(); ++it) {std::cout << it.key() << ": " << it.value() << std::endl;}return 0;
}

2.2 封装应用

2.2.1 NLOHMANN_DEFINE_TYPE_INTRUSIVE

NLOHMANN_DEFINE_TYPE_INTRUSIVE 是一个宏,属于 nlohmann/json 库,用于简化 C++ 类型与 JSON 数据之间的序列化与反序列化过程。这个宏的主要作用是自动生成将类或结构体的成员与 JSON 字段进行映射的代码。

#include <nlohmann/json.hpp>struct Person {std::string name;int age;// 使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏NLOHMANN_DEFINE_TYPE_INTRUSIVE(Person, name, age)
};

序列化和反序列化
使用该宏后,您可以轻松地将 Person 对象转换为 JSON,或从 JSON 创建 Person 对象:

#include <iostream>int main() {// 创建一个 Person 对象Person person{"Alice", 30};// 序列化为 JSONnlohmann::json j = person;std::cout << j.dump() << std::endl;  // 输出: {"name":"Alice","age":30}// 从 JSON 反序列化为 Person 对象Person new_person = j.get<Person>();std::cout << new_person.name << ", " << new_person.age << std::endl;  // 输出: Alice, 30return 0;
}

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

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

相关文章

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 2 raise函数(自杀)作用&#xff1a;示例&#xff1a; 3 abort函数(自杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 4 …

汇编DEBUG程序调用

工具 系统&#xff1a;Windows 11 应用&#xff1a;DOSBox 0.74-3 下载安装教程&#xff1a;本人写的《DOSBox下载安装&#xff08;Windows系统 DOSBox 0.74-3&#xff09;》 https://blog.csdn.net/just_do_it_sq/article/details/142715182?spm1001.2014.3001.5501 相关文…

ARM 架构、cpu

一、ARM的架构 ARM是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构. 1、ARM芯片特点 ARM芯片的主要特点有以下几点&#xff1a; 精简指令集&#xff1a;ARM芯片使用精简指令集&#xff0c;即每条指令只完成一项简单的操作&#xff0c;从而提高指令的执行效率…

沂机管理系统/data/Ajax.aspx接口存在SQL注入漏洞

漏洞描述 沂机管理系统/data/Ajax.aspx接口存在SQL注入漏洞&#xff0c;攻击者可以获取服务器权限 漏洞复现 body"后台管理系统演示版" POC GET /data/Ajax.aspx?methodlog_list&page1&limit20&fkey1&fdate12024-10-0100%3A00%3A00&fdate2…

文章资讯职场话题网站源码整站资源自带2000+数据

介绍&#xff1a; 数据有点多&#xff0c;数据资源包比较大&#xff0c;压缩后还有250m左右。值钱的是数据&#xff0c;网站上传后直接可用&#xff0c;爽飞了 环境&#xff1a;NGINX1.18 mysql5.6 php7.2 代码下载

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点&#xff1a;支持IPv4 提供高精版、…

【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?

前言&#xff1a; 零实习转行产品经理经验分享01-学习准备篇_哔哩哔哩_bilibili 该篇内容主要是对bilibili这个视频的观后笔记~谢谢美丽滴up主友情分享。 全文摘要&#xff1a;如何在0实习且没有任何产品相关经验下&#xff0c;如何上岸产品经理~ 目录 一、想清楚为什么…

k8s的简介和部署

一、k8s简介 在部署应用程序的方式上面&#xff0c;主要经历了三个阶段&#xff1a; 传统部署:互联网早期&#xff0c;会直接将应用程序部署在物理机上优点:简单&#xff0c;不需要其它技术的参与缺点:不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计算资源&…

从零开始,她如何为客户创建语义知识图谱?

在这篇文章中&#xff0c;Capgemini 的知识图谱负责人 Veronika Heimsbakk 分享了她为客户创建语义知识模型的方法。阅读本指南&#xff0c;了解她如何与客户合作&#xff0c;从头开始构建语义知识模型&#xff0c;并发现可以应用于您自己的语义建模项目的实践。 如何为客户构…

参数标准+-db和-db

-db是因为比值是相近的&#xff0c;值越进行越好&#xff0c;正负db代表两个值差异不大&#xff0c;可以分子比分母大或者分母比分子大-db代表串扰&#xff0c;分子比分母小&#xff0c;所以负db的值越小越好

5G NR BWP 简介

文章目录 BWP介绍BWP 分类BWP相关总结 BWP介绍 5G NR 系统带宽比4G LTE 大了很多&#xff0c;4G LTE 最大支持带宽为20MHz&#xff0c; 而5G NR 的FR1 最大支持带宽为100MH在&#xff0c; FR2 最大支持带宽为 400MH在。带宽越大&#xff0c;意味了终端功耗越多。为了减少终端的…

(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)

目录 前言 修改方向 修改内容 效果展示 两个新的问题&#x1f64b; 1.问题1 2.问题2 代码如下&#xff1a; 前言 我们上一节实现了贪吃蛇吃食物身体节点变长&#xff0c;但是食物的刷新位置不是随机的&#xff0c;并且初始化几次后食物就刷不见了&#xff0c;本节我们就来…

基于webComponents的纯原生前端框架

我本人的个人开发web前端前框架xui&#xff0c;正在开发中&#xff0c;业已完成50%的核心开发工作&#xff0c;并且在开发过程中逐渐完善. 目前框架未采用任何和市面上框架模式&#xff0c;没有打包过程&#xff0c;实现真实的开箱即用。 当然在开发过程中也会发现没有打包工…

机器学习系列篇章0 --- 人工智能机器学习相关概念梳理

说明 人工智能(Artificial Intelligence, AI)是大势所趋&#xff0c;我们正处于一个AI开始大爆发的时代&#xff0c;基于AI的各类工具在科研、生产、生活各方各面给我们带来了巨大的便利和影响(好的以及坏的)&#xff0c;有关AI的一切我们不可不察。 我并非计算机这个行当的科…

[每周一更]-(第117期):硬盘分区表类型:MBR和GPT区别

文章目录 1. **支持的磁盘容量**2. **分区数量**3. **引导方式**4. **冗余和数据恢复**5. **兼容性**6. **安全性**7. **操作系统支持**8. 对比 国庆假期前补一篇 在一次扫描机械硬盘故障的问题&#xff0c;发现我本机SSD和机械硬盘的分类型不一样&#xff0c;分别是GPT和MBR&a…

茴香豆:企业级知识库问答工具

茴香豆 茴香豆 是由书生浦语团队开发的一款开源、专门针对国内企业级使用场景设计并优化的知识问答工具。在基础 RAG 课程中我们了解到&#xff0c;RAG 可以有效的帮助提高 LLM 知识检索的相关性、实时性&#xff0c;同时避免 LLM 训练带来的巨大成本。在实际的生产和生活环境…

Ubuntu22.04 Docker 国内安装最靠谱教程

目前docker在国内安装常存在众所周知的网络问题&#xff0c;如果安装过程如果从官网地址安装以及安装之后从官网要拉取镜像都存在问题。这篇文章主要针对这两个问题总结最靠谱的docker安装教程。 1. docker安装 1.1 系统环境概述 Ubuntu 22.04linux内核版本 6.8&#xff08;…

SysML案例-呼吸机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 图片示例摘自intercax.com&#xff0c;作者是Intercax公司总裁Dirk Zwemer博士。

HTTPS协议详解:从原理到流程,全面解析安全传输的奥秘

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

基于SPI协议的Flash扇区擦除实验

当一块Flash芯片中的不同的扇区烧录了不同的程序&#xff0c;而我们只想擦除某个扇区的程序保留其他程序时&#xff0c;Flash的全擦除是不能满足要求的&#xff0c;这时候就需要扇区擦除来实现这一功能。扇区擦除可以对Flash芯片中的某一扇区进行擦除而不改变其他扇区中的存储数…