c++学习:json库例子

news2024/11/27 16:12:22

目录

初始化

解析string字符串并输出

赋值  给json赋值string,char *,QString,bool,int

赋值  将json转为string,char *,QString 

删除

嵌套对象和数组的组合与解析

JSON 数组  遍历,添加,修改  

类型转换

类型检查

自定义类与 JSON 序列化


用的是nlohmann/json的库

初始化

#include <nlohmann/json.hpp>
using json = nlohmann::json;

解析string字符串并输出

std::string json_str = R"({"name": "John", "age": 30, "city": "New York"})";

json j = json::parse(json_str);

std::cout << "Name: " << j["name"] << "\n";
std::cout << "Age: " << j["age"] << "\n";
std::cout << "City: " << j["city"] << "\n";

赋值  给json赋值string,char *,QString,bool,int

    json j;
    // 使用 std::string 给 JSON 赋值
    std::string name = "John";
    j["name"] = name;
    const char* city = "New York";
    j["city"] = city;
    QString country = "USA";
    j["country"] = country.toStdString();
    bool is_student = true;
    j["is_student"] = is_student;
    int age = 25;
    j["age"] = age;

赋值  将json转为string,char *,QString 

    json j;
    j["name"] = "John";
    j["age"] = 30;
    j["city"] = "New York";
    j["is_student"] = false;

    std::string json_str = j.dump();
    std::cout << json_str << std::endl;

    const char* char_text = json_str.c_str();

    // 如果需要修改 char*,可以进行拷贝:
    char* char_text_copy = new char[json_str.size() + 1];
    std::strcpy(char_text_copy, json_str.c_str());

    // 记得使用 delete[] 释放内存
    delete[] char_text_copy;

    QString qstr = QString::fromStdString(json_str);

删除

    json j = {
        {"name", "John"},
        {"age", 30},
        {"city", "New York"}
    };

    j.erase("age");

    std::cout << j.dump(4) << std::endl;

嵌套对象和数组的组合与解析

    json j1;

    // 嵌套 JSON 数组
    j1["name"] = "John";
    j1["age"] = 30;
    // 数组
    j1["phones"] = {"123-456-7890", "987-654-3210"};
    // 对象
    j1["address"] = {{"street", "123 Main St"}, {"city", "New York"}};
构建
{
    "address": {
        "city": "New York",
        "street": "123 Main St"
    },
    "age": 30,
    "name": "John",
    "phones": [
        "123-456-7890",
        "987-654-3210"
    ]
}

    json j = {
        {"name", "John"},
        {"age", 30},
        {"address", {
            {"street", "123 Main St"},
            {"city", "New York"},
            {"zipcode", "10001"}
        }},
        {"phones", {"123-456-7890", "987-654-3210"}}
    };

    // 访问嵌套数据
    std::cout << "Name: " << j["name"] << std::endl;
    std::cout << "Street: " << j["address"]["street"] << std::endl;
    std::cout << "First phone: " << j["phones"][0] << std::endl;

JSON 数组  遍历,添加,修改  

    // 遍历
    json j = {1, 2, 3, 4, 5};
    for (auto& el : j) {
        std::cout << el << " ";
    }
    std::cout << std::endl;

    // 添加
    j.push_back(6);
    // 输出修改后的数组
    std::cout << j.dump(4) << std::endl;

    // 修改
    json j = {
        {1, 2, 3},
        {4, 5, 6}
    };

    // 修改嵌套数组中的元素
    j[1][2] = 99;
[
    [
        1,
        2,
        3
    ],
    [
        4,
        5,
        99
    ]
]

类型转换

    json j = {
        {"name", "John"},
        {"age", 30},
        {"is_student", false}
    };

    // 将 JSON 数据转换为 C++ 类型
    std::string name = j["name"].get<std::string>();
    int age = j["age"].get<int>();
    bool is_student = j["is_student"].get<bool>();

    std::cout << "Name: " << name << ", Age: " << age << ", Is student: " << is_student << std::endl;

类型检查


    is_number_integer()
    is_string()
    is_array()
    is_object()
    is_boolean()

自定义类与 JSON 序列化

class Person {
public:
    std::string name;
    int age;
    bool is_student;

    // 自定义的序列化函数
    NLOHMANN_DEFINE_TYPE_INTRUSIVE(Person, name, age, is_student)
};

    // 创建 Person 对象
    Person p{"John", 30, false};

    // 将 Person 对象序列化为 JSON
    json j = p;

    std::cout << j.dump(4) << std::endl;

    // 从 JSON 反序列化为 Person 对象
    Person new_p = j.get<Person>();

    std::cout << "Name: " << new_p.name << ", Age: " << new_p.age << ", Is student: " << new_p.is_student << std::endl;

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

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

相关文章

FileZilla 报错解决

一、错误:严重错误: 无法连接到服务器 解决方法&#xff1a;FileZilla站点的用户名密码要和linux用户名密码保持一致&#xff0c;出现这个报错大概率是用户名和密码不一致导致的。 二、错误&#xff1a;文件传输失败 解决方法&#xff1a;检查linux下的文件夹是否有可执行权限…

替代Postman ,17.3K star!

现在&#xff0c;许多人都朝着全栈工程师的方向发展&#xff0c;API 接口的编写和调试已成为许多开发人员必备的技能之一。 工欲善其事&#xff0c;必先利其器。拥有一款优秀的 API 工具对于任何工程师来说都是极为重要的&#xff0c;它能够帮助我们高效地完成各种开发任务。 …

Flutter 3.24.5安装配置——2024年11月26日

目录 1️⃣前置安装使用环境配置步骤安装Flutter SDK安装Android SDK修改文件默认安装位置&#xff08;.gradle, AVD&#xff09;开始项目 2️⃣执行结果&#x1fab2;Bug找不到**.jar文件 &#x1f517;参考链接 1️⃣前置安装 使用环境 Windows 11IDEA 2024.2.3Flutter 3.2…

Perforce SAST专家详解:自动驾驶汽车的安全与技术挑战,Klocwork、Helix QAC等静态代码分析成必备合规性工具

自动驾驶汽车安全吗&#xff1f;现代汽车的软件包含1亿多行代码&#xff0c;支持许多不同的功能&#xff0c;如巡航控制、速度辅助和泊车摄像头。而且&#xff0c;这些嵌入式系统中的代码只会越来越复杂。 随着未来汽车的互联程度越来越高&#xff0c;这一趋势还将继续。汽车越…

(计算机组成原理)期末复习

第一章 计算机的基本组成&#xff1a;硬件软件&#xff08;程序&#xff09;计算机系统 软件有系统软件&#xff08;系统管理工具&#xff09;&#xff0c;应用软件 计算机硬件&#xff1a;包括主机和外设&#xff0c;主机包括CPU和内存&#xff0c;***CPU由运算器和控制器所组…

UEFI 中的 Protocol

Protocol 在 UEFI 内核中的表示 typedef VOID *EFI_HANDLE;EFI_HANDLE是指向某种对象的指针&#xff0c;UEFI 用它来表示某个对象。 UEFI 扫描总线后&#xff0c;会为每个设备建立一个 Controller 对象&#xff0c;用于控制设备&#xff0c;所有该设备的驱动以 Protocol 的形式…

量子安全与经典密码学:一些现实方面的讨论

量子安全与经典密码学 背景&#xff1a;量子安全与经典密码学量子计算对传统密码学的威胁 安全性分析经典密码学的数学复杂性假设**量子密码学的物理不可克隆性假设** **性能与实现难度**后量子算法在经典计算机上的运行效率**量子通信设备的技术要求与成本** **可扩展性与适用…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊&#xff0c;时代发展这么快&#xff0c;在时代的洪流下&#xff0c;我们个人能抓住些什么呢。我问了大模型&#xff0c;文心一言是这样回答的&#xff1a; 在快速发展的时代背景下&#xff0c;个人确实面临着诸多挑战&#xff0c;但同时也充满…

PostgreSQL的学习心得和知识总结(一百五十八)|在线调优工具pgtune的实现原理和源码解析

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域&#xff0c;选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5&#xff08;Unreal Engine 5&#xff09;作为两大主流3D软件&#xff0c;各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…

机器学习—迁移学习:使用其他任务中的数据

对于一个没有那么多数据的应用程序&#xff0c;迁移学习是一种奇妙的技术&#xff0c;它允许你使用来自不同任务的数据来帮助你的应用程序&#xff0c;迁移学习是如何工作的&#xff1f; 以下是迁移学习的工作原理&#xff0c;假设你想识别手写的数字0到9&#xff0c;但是你没…

LeetCode 3206.交替组 I:遍历

【LetMeFly】3206.交替组 I&#xff1a;遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/alternating-groups-i/ 给你一个整数数组 colors &#xff0c;它表示一个由红色和蓝色瓷砖组成的环&#xff0c;第 i 块瓷砖的颜色为 colors[i] &#xff1a; colors[i] …

如何通过高效的缓存策略无缝加速湖仓查询

引言 本文将探讨如何利用开源项目 StarRocks 的缓存策略来加速湖仓查询&#xff0c;为企业提供更快速、更灵活的数据分析能力。作为 StarRocks 社区的主要贡献者和商业化公司&#xff0c;镜舟科技深度参与 StarRocks 项目开发&#xff0c;也为企业着手构建湖仓架构提供更多参考…

25A物联网微型断路器 智慧空开1P 2P 3P 4P-安科瑞黄安南

微型断路器&#xff0c;作为现代电气系统中不可或缺的重要组件&#xff0c;在保障电路安全与稳定运行方面发挥着关键作用。从其工作原理来看&#xff0c;微型断路器通过感知电流的异常变化来迅速作出响应。当电路中的电流超过预设的安全阈值时&#xff0c;其内部的电磁感应装置…

目标检测,图像分割,超分辨率重建

目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务&#xff0c;它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为&#xff1a;语义分割、实例分割、全景分割。 语义分割&#xff08;Semantic Segmentation&#xff09;&…

16 —— Webpack多页面打包

需求&#xff1a;把 黑马头条登陆页面-内容页面 一起引入打包使用 步骤&#xff1a; 准备源码&#xff08;html、css、js&#xff09;放入相应位置&#xff0c;并改用模块化语法导出 原始content.html代码 <!DOCTYPE html> <html lang"en"><head&…

《PH47 快速开发教程》发布

PDF 教程下载位于CSDN资源栏目&#xff08;网页版本文上方&#xff09; 或Gitee&#xff1a;document ss15/PH47 - 码云 - 开源中国

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中&#xff0c;车牌识别&#xff08;LPR&#xff09;技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力&#xff0c;为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…

C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)

目录 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 题目截图&#xff1a; 此题所说的…

[网安靶场] [更新中] UPLOAD LABS —— 靶场笔记合集

GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场一个想帮你总结所有类型的上传漏洞的靶场. Contribute to c0ny1/upload-labs development by creating an account on GitHub.https://github.com/c0ny1/upload-labs 0x01&#xff1a;UPLOAD LABS 靶场初识…