nlohmann::json教程

news/2025/3/25 20:58:04/

json__0">nlohmann::json 核心函数和方法

1. 基础构造与初始化

函数/方法描述示例
json j;创建一个空的 JSON 对象(默认是 object 类型)json j;
json::object()显式创建一个空的 JSON 对象json j = json::object();
json::array()显式创建一个空的 JSON 数组json arr = json::array();
json j = {...};直接初始化 JSON 对象或数组json j = {{"key", "value"}, {"arr", {1, 2}}};
json::parse(json_str)从字符串解析 JSON 数据json j = json::parse(R"({"name": "Alice"})");
json::from_msgpack(data)从 MessagePack 二进制数据解析 JSONjson j = json::from_msgpack(msgpack_data);
json::from_bson(data)从 BSON 二进制数据解析 JSONjson j = json::from_bson(bson_data);

2. 数据访问与修改

函数/方法描述示例
j[key]访问或修改对象的键值(需确保键存在)j["age"] = 25;
j.at(key)安全访问键值(若键不存在,抛出异常)std::string name = j.at("name");
j.value(key, default)安全访问键值,若不存在返回默认值int age = j.value("age", 0);
j.push_back(value)向 JSON 数组末尾添加元素j["hobbies"].push_back("coding");
j.emplace_back(args)直接在数组末尾构造元素j.emplace_back("new_item");
j.size()返回对象或数组的元素数量if (j.size() > 0) { ... }
j.empty()检查 JSON 是否为空对象/数组if (j.empty()) { ... }
j.contains(key)检查对象是否包含指定键if (j.contains("address")) { ... }
j.erase(key)移除 JSON 对象的某个键j.erase("age");
j.clear()清空 JSON 对象或数组j.clear();

3. 序列化与反序列化

函数/方法描述示例
j.dump(indent)将 JSON 转为字符串(indent 控制缩进)std::string s = j.dump(4);
json::parse(str)从字符串解析 JSONjson j = json::parse(R"({"key": "value"})");
json::to_msgpack(j)将 JSON 转换为 MessagePack 格式std::vector<uint8_t> msgpack = json::to_msgpack(j);
json::to_bson(j)将 JSON 转换为 BSON 格式std::vector<uint8_t> bson = json::to_bson(j);
operator<< / operator>>通过流读写 JSON 数据std::ofstream("data.json") << j; std::ifstream("data.json") >> j;

4. 类型检查与转换

函数/方法描述示例
j.is_object() / j.is_array() / j.is_string()检查 JSON 值的具体类型if (j["age"].is_number()) { ... }
j.get<T>()将 JSON 值转换为指定类型(需类型匹配)int age = j["age"].get<int>();
j.type_name()获取 JSON 值的类型名称std::string type = j.type_name();

5. 遍历与迭代

函数/方法描述示例
j.items()返回对象的键值对迭代器(仅对对象有效)for (auto& [key, val] : j.items()) { ... }
j.begin() / j.end()返回数组或对象的迭代器for (auto it = j.begin(); it != j.end(); ++it) { ... }
j.keys()获取对象的所有键for (const auto& key : j.keys()) { ... }

6. 合并与修改

函数/方法描述示例
j.merge_patch(other)合并两个 JSON 对象(覆盖重复键的值)j1.merge_patch(j2);
j.patch(json_patch)应用 JSON Patch 修改操作j = j.patch(patch);
j.flatten()将嵌套 JSON 展开为扁平结构json flat = j.flatten();
j.unflatten()将扁平化 JSON 恢复为嵌套结构json nested = flat.unflatten();

7. 示例代码

// 创建对象
json j = {{"name", "Alice"},{"scores", {90, 85, 95}},{"metadata", {{"version", 1.0}, {"active", true}}}
};// 序列化与反序列化
std::string json_str = j.dump(4); // 带缩进
json parsed = json::parse(json_str);// 安全访问
std::string name = parsed.value("name", "Unknown");
int score = parsed["scores"][0].get<int>();// 合并对象
json update = {{"metadata", {{"version", 2.0}}}};
parsed.merge_patch(update);

http://www.ppmy.cn/news/1583048.html

相关文章

[学成在线]06-视频分片上传

上传视频 需求分析 教学机构人员进入媒资管理列表查询自己上传的媒资文件。 点击“媒资管理” 进入媒资管理列表页面查询本机构上传的媒资文件。 教育机构用户在"媒资管理"页面中点击 "上传视频" 按钮。 点击“上传视频”打开上传页面 选择要上传的文件…

OPENCV数字识别(非手写数字/采用模板匹配)

这篇文章的重点在于 模板匹配 的使用。模板匹配是计算机视觉中的一项基本技术&#xff0c;它通过比对输入图像与模板图像的相似度&#xff0c;来进行目标识别。对于数字识别&#xff0c;特别是标准数字的识别&#xff0c;模板匹配非常有效。 请看效果&#xff1a; 文章结构 …

在shell脚本内部获取该脚本所在目录的绝对路径

目录 需求描述 方法一&#xff1a;使用 dirname 和 readlink 命令 方法二&#xff1a;使用 BASH_SOURCE 变量 方法三&#xff1a;仅使用纯 Bash 实现 需求描述 工作中经常有这样情况&#xff0c;需要在脚本内部获取该脚本自己所在目录的绝对路径。 假如有一个脚本/a/b/c/…

Excel online开始支持Copilot高级数据分析:Python提供强大的数据见解

前文讲过Excel中的copilot可以直接调用Python进行高级数据分析&#xff1a; Copilot&#xff1a;Excel中的Python高级分析来了 Python in Excel高级分析&#xff1a;一键RFM分析 超越DeepSeek&#xff1a;Copilot in Excel高级数据分析原生支持Python无需安装软件 零代码、…

git,openpnp - 根据安装程序打包名称找到对应的源码版本

文章目录 git,openpnp - 根据安装程序打包名称找到对应的源码版本概述笔记备注 - 提交时间不可以作为查找提交记录的依据END git,openpnp - 根据安装程序打包名称找到对应的源码版本 概述 想在openpnp官方最新稳定版上改一改&#xff0c;首先就得知道官方打包的安装程序对应的…

基于Spring Boot的供应商管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

2025年Postman的五大替代工具

虽然Postman是一个广泛使用的API测试工具&#xff0c;但许多用户在使用过程中会遇到各种限制和不便。因此&#xff0c;可能需要探索替代解决方案。本文介绍了10款强大的替代工具&#xff0c;它们能够有效替代Postman&#xff0c;成为你API测试工具箱的一部分。 什么是Postman&…

自动驾驶背后的数学:多模态传感器融合的简单建模

上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…