nlohmann json库的使用Demo

news2024/12/29 9:44:29

目录

1 简介

2 构建 JSON 对象

2.1 集合

2.2 字典

2.3 组合

3 解析 JSON 对象

4 演示Demo

4.1 开发环境

4.2 功能介绍

4.3 下载地址


1 简介

        nlohmann/json 是一个方便易用的 C++ JSON 库,可以实现将 JSON 数据与 C++ 对象相互转换的功能,支持常见的 JSON 数据类型,例如对象、数组、字符串等。

        nlohmann json的开源项目地址,其中有对json使用方法的详细说明:

https://github.com/nlohmann/json

        对于我们项目中要使用nlohmann json工具,只需要引入json.hpp这一个文件

#include "nlohmann/json.hpp"
using json = nlohmann::json;

        本文将针对 nlohmann/json 的集合和字典功能进行讲解,并介绍如何从 JSON 对象中解析特定字段。

2 构建 JSON 对象

2.1 集合

        在 nlohmann/json 中,可以使用 nlohmann::json 类型来表示 JSON 数组。以下是一些创建和操作 JSON 数组的示例:

        /*
                创建空的 JSON 数组
                [
                        "element1",
                        42
                ]
        */
        nlohmann::json json_array = nlohmann::json::array();

        // 添加元素到 JSON 数组
        json_array.push_back("element1");
        json_array.push_back(42);

        // 遍历 JSON 数组并输出每个元素
        for (const auto& element : json_array) {
                std::cout << "Element: " << element << std::endl;
        }

        在上述示例中,我们首先使用 nlohmann::json::array() 创建了一个空的 JSON 数组 json_array。然后,我们分别使用 push_back() 方法向该数组中添加一个字符串元素 "element1" 和一个整数元素 42。最后,我们使用 for 循环遍历数组中的所有元素,并输出它们的值。

2.2 字典

        在 nlohmann/json 中,可以使用 nlohmann::json 类型来表示 JSON 对象,它通常被认为是一个字典。以下是一些创建和操作 JSON 对象的示例:

        /*
                创建空的 JSON 对象
                {
                        "key1": "value1",
                        "key2": 42
                }
        */
        nlohmann::json json_object = nlohmann::json::object();

        // 添加键值对到 JSON 对象
        json_object["key1"] = "value1";
        json_object["key2"] = 42;

        // 遍历 JSON 对象并输出每个键和值
        for (auto& element : json_object.items()) {
                std::cout << "Key: " << element.key() << ", Value: " << element.value() << std::endl;
        }

        在上述示例中,我们首先使用 nlohmann::json::object() 创建了一个空的 JSON 对象 json_object。然后,我们使用 [] 运算符向该对象中添加两个键值对 "key1": "value1""key2": 42。最后,我们使用 for 循环遍历字典中的所有键值对,并输出它们的键和值。

2.3 组合

        除了单独创建数组或字典之外,nlohmann/json 还支持将它们组合起来以创建更复杂的数据结构。例如,以下示例演示如何使用 JSON 对象和数组嵌套来创建具有多层次结构的 JSON 数据:

        /* 
                创建一个具有多层结构的 JSON 对象
                {
                        "addresses": [
                                {
                                        "city": "Anytown",
                                        "state": "CA",
                                        "street": "123 Main St"
                                },
                                {
                                        "city": "Othertown",
                                        "state": "NY",
                                        "street": "456 Oak Ave"
                                }
                        ],
                        "age": 30,
                        "name": "John Doe"
                }
        */
        nlohmann::json json_data;

        // 在 JSON 对象中添加一个名为 "name" 的字符串属性
        json_data["name"] = "John Doe";

        // 在 JSON 对象中添加一个名为 "age" 的整数属性
        json_data["age"] = 30;

        // 在 JSON 对象中添加一个名为 "addresses" 的 JSON 数组
        json_data["addresses"] = nlohmann::json::array();

        // 创建一个具有多层结构的 JSON 对象,并添加到数组中
        nlohmann::json address1;
        address1["street"] = "123 Main St";
        address1["city"] = "Anytown";
        address1["state"] = "CA";

        // 添加第一个地址对象到数组中
        json_data["addresses"].push_back(address1);

        // 创建另一个具有多层结构的 JSON 对象,并添加到数组中
        nlohmann::json address2;
        address2["street"] = "456 Oak Ave";
        address2["city"] = "Othertown";
        address2["state"] = "NY";

        // 添加第二个地址对象到数组中
        json_data["addresses"].push_back(address2);

        // 将 JSON 对象转换为字符串并输出
        std::string json_string = json_data.dump();
        std::cout << json_string << std::endl;

        在上述示例中,我们首先创建了一个空的 JSON 对象 json_data。然后,我们向该对象中添加一个名为 "name" 的字符串属性和一个名为 "age" 的整数属性。接着,我们通过将 nlohmann::json::array() 添加到对象中来创建一个名为 "addresses" 的 JSON 数组。

        我们然后创建两个具有多层结构的 JSON 对象,分别代表不同的地址,并使用上述方法将它们添加到 "addresses" 数组中。最后,我们使用 dump() 方法将 JSON 对象转换为字符串,并将其输出到控制台上。

3 解析 JSON 对象

        设置好 nlohmann::json 对象以存储 JSON 数据后,您可以使用 [] 运算符访问特定字段。例如,假设我们有以下 JSON 数据:

{
    "name": "John Doe",
    "age": 30,
    "addresses": [
        {
            "street": "123 Main St",
            "city": "Anytown",
            "state": "CA"
        },
        {
            "street": "456 Oak Ave",
            "city": "Othertown",
            "state": "NY"
        }
    ]
}

        要访问 "name" 字段,请使用以下代码:

// 解析 JSON 字符串并将其存储在 json_data 对象中
nlohmann::json json_data = nlohmann::json::parse(json_string);

// 获取 "name" 字段的值并将其输出
std::string name = json_data["name"];
std::cout << "Name: " << name << std::endl;

        在上述示例中,我们首先使用 nlohmann::json::parse() 方法解析 JSON 字符串,并将其存储在 json_data 对象中。然后,我们使用 [] 运算符获取字段名为 "name" 的值,并将其赋值给一个字符串变量 name。最后,我们输出该变量的值到控制台上。

        对于数组,可以使用 for 循环和 size() 方法遍历其中的每个元素,例如:

// 遍历 "addresses" 数组并输出每个地址的城市和州
for (const auto& address : json_data["addresses"]) {
    std::string city = address["city"];
    std::string state = address["state"];
    std::cout << "City: " << city << ", State: " << state << std::endl;
}

        在上述示例中,我们首先使用 for 循环遍历 JSON 数据中 "addresses" 数组中的每个元素。然后,我们对于每个元素使用 [] 运算符获取其 "city""state" 字段的值,并将这些值分别赋给字符串变量 citystate。最后,我们输出这些变量的值到控制台上。

4 演示Demo

4.1 开发环境

  • Visual Studio 2015

  • nlohmann json

  • Windows 10 Pro x64

4.2 功能介绍

        演示使用nlohmann json进行json对象的构建和解析。

4.3 下载地址

        开发环境:

  • Visual Studio 2015

  • nlohmann json

  • Visual Studio 2015

        下载地址:nlohmann json库的使用Demo

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

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

相关文章

Linux驱动开发—设备模型框架 kset和 kobject 详解

文章目录 什么是设备模型&#xff1f;设备模型的主要组成部分设备模型的关键功能设备模型的实现结构设备模型的重要性 kset和 kobject介绍1. kobject2. kset3. kobject 和 kset 的关系4. 应用场景 kobject中parent概念1. parent 字段的作用2. parent 字段的使用示例3. sysfs 中…

算法的学习笔记—对称的二叉树(牛客JZ28)

&#x1f600;前言 在算法的世界中&#xff0c;二叉树是一个极其重要的数据结构。它不仅广泛应用于各种算法的设计中&#xff0c;也是面试中常见的考察点之一。今天&#xff0c;我们将深入探讨一个经典的二叉树问题——对称的二叉树&#xff0c;并且会展示如何通过Java代码来解…

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…

去中心化的新时代:Web3技术的全球影响

随着技术的不断演进&#xff0c;Web3正引领互联网的去中心化新时代。相较于传统的Web1和Web2&#xff0c;Web3通过去中心化、区块链和智能合约等技术&#xff0c;正在重塑网络的运作方式。这一变革不仅提升了网络的安全性和透明度&#xff0c;也对全球经济、社会和文化产生了深…

品牌出海新策略:携手TikTok达人,合作孵化IP实现双赢

在当今数字化时代&#xff0c;TikTok达人的IP孵化作为一种创新的合作模式&#xff0c;正逐渐成为品牌出海的新兴策略。通过与有潜力的TikTok达人合作&#xff0c;共同孵化新的IP&#xff0c;品牌不仅能够突破传统营销的局限&#xff0c;还能实现与达人共同成长的双赢局面。本文…

物流抓取机器人整体设计方案

一、功能简介 1、运行环境&#xff1a;巡线行驶&#xff08;7路数字循迹&#xff0c;麦克纳姆轮车底盘&#xff09; 2、目标识别&#xff1a;颜色识别&#xff08;Maix-II Dock 视觉模块&#xff09; 3、目标定位&#xff1a;视觉测距&#xff08;Maix-II Dock 视觉模块&#x…

海外直播对网络的要求有哪些?

在全球化的大潮中&#xff0c;海外直播已成为越来越多企业、个人和机构展示自身、拓展市场、与全球用户互动的重要渠道。然而&#xff0c;在进行海外直播时&#xff0c;网络环境的搭建往往成为制约其成功与否的关键因素。那么&#xff0c;究竟什么样的网络环境才能满足海外直播…

Python使用Selenium进行Web自动化测试详解

目录 引言 一、Selenium简介 Selenium的核心组件 二、环境搭建 1. 安装Python 2. 安装Selenium库 3. 下载并配置浏览器驱动 三、基础用法 1. 启动浏览器 2. 定位页面元素 3. 元素操作 4. 等待元素加载 1. 测试目的 2. 测试步骤与代码实现 3. 注意事项 结论 引言…

学习方法[2]:如何有效地检索及选择学习资料?(致在自学之路仍在坚持的人)

有效地检索及选择学习资料 前言一、如何进行有效检索资料&#xff1f;&#xff08;以bing为例&#xff09;1.1 基础搜索1.2 高级搜索1.2.1 高级搜索关键字1.2.2 高级搜索选项 二、如何选择学习资料&#xff1f;&#xff08;以编程为例&#xff09;2.1 源代码2.2 官方文档2.3 英…

Quartz - 定时任务框架集成

参考了若依框架&#xff0c;将quartz定时任务框架集成到自己的项目当中。 目录 一、Quartz概述二、库表创建1.Quartz关键表&#xff08;11张&#xff09;表SQL 2.自定义业务表&#xff08;2张&#xff09;表SQL 三、代码示例1.依赖引入2.类文件1&#xff09;定时任务配置类2&am…

优优嗨聚集团:餐饮合作新未来引领美食产业新风尚

在快速变化的21世纪&#xff0c;餐饮行业作为民生消费的重要组成部分&#xff0c;正经历着前所未有的变革与挑战。随着消费者需求的多元化、个性化以及科技的不断进步&#xff0c;餐饮合作的新模式正悄然兴起&#xff0c;为行业带来了前所未有的发展机遇与活力。本文将探讨餐饮…

如何复现Github上的项目以及conda的常用操作指令

在GitHub上关于深度学习的项目代码通常包含多种类型的文件&#xff0c;每种文件都有其特定的作用。以下是一些常见的文件及其作用的概述&#xff1a; 一个常用的项目结构如下&#xff1a; --project_name/ &#xff1a;项目名----data/&#xff1a;数据集--------__init__.py…

vue+elementui 主题配色修改-打造个性化配色系统

上一期中利用global.css来覆盖elementui原有的配色&#xff0c;修改了按钮和消息框。这一期继续尝试修改其他的控件。 1 修改info 类型按钮 上次修改了primary按钮&#xff0c;这次修改一下info按钮&#xff0c;在global.css中添加 .el-button--info {background-color: #d9d…

deepspeed的并行模式介绍笔记

1.整体框架 2.并行模式 1.数据并行DDP 数据切分以后&#xff0c;分开单张卡训练得到参数&#xff0c;然后综合在单卡计算。 要点&#xff1a;前向计算和反向计算两步骤走并汇总。 1.前向计算 需要留一块主卡一定空间用于综合。 2.反向传播 利用前向传播的汇总参数得到各个…

深度学习基础—超参数调试

1.超参数调试顺序 在训练深度网络最难的事情之一是超参数的选择&#xff0c;如何选择合适的超参数取值&#xff1f;下面我将谈谈&#xff0c;如下是我所理解的超参数调试顺序&#xff1a; 重要性排序 超参数 Top1梯队 学习率a Top2梯队 min-batch大小&#xff0c;隐层神经…

10 VS Code 调试技巧之逐断点、逐过程、单步调试与单步跳出

目录 1 断点调试 1.1 断点调试介绍 1.2 如何设置断点 1.3 如何开启调试 2 调试类型 2.1 逐断点调试 2.2 逐过程调试 2.3 单步调试 2.4 单步跳出 1 断点调试 遇到难以捉摸的软件错误时&#xff0c;老练的程序员会推荐断点调试。通过设置断点&#xff0c;逐步跟踪…

nvidia jetson 系列开发板交叉编译方法,CUDA依赖程序

资源 Toolchain Information jetson-linux jetpack 文章目录 资源1 方案1 qemu-aarch64-static和docker 容器编译jetson2 方案2 模拟器交叉编译器2.1 应对库缺失的情况&#xff0c;进行环境准备2.1.1 模拟器(方案1)2.1.2 在jetson上面进行安装&#xff08;方案2&#xff09;2.…

如何有效清理宝塔控制面板中的垃圾文件与优化系统性能

宝塔控制面板&#xff08;BT-Panel&#xff09;作为一款流行的服务器管理软件&#xff0c;极大地简化了Linux服务器的管理任务&#xff0c;包括网站部署、数据库管理、文件操作等。然而&#xff0c;随着服务器运行时间的增长&#xff0c;系统中会积累各种临时文件、日志文件、缓…

STM32G474按钮输入和点灯

在获取到工程模板后&#xff0c;学习某个CPU的第一步通常都是IO口操作。因此按钮输入和点灯&#xff0c;就是本次学习的第一个程序。先从简单入手。 和GPIO操作有关的函数如下: __HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟 __HAL_RCC_GPIOB_CLK_ENABLE();//使能GPIOB时钟 _…

Redis7基础篇(四)

Redis管道 引入 set k1 v1.......需要往返三次 这是一个比较消耗性能的一件事情 怎么就可以一次性的将这些命令执行 就是使用mset这个方法 这个mset就相当于一个管道 把这些命令做成一个流水线的形式进行处理 解决思路 案例 两个set类型的三个哈希类型的一个list类型的 我们要…