当前位置: 首页 > article >正文

c++学习:json库例子

目录

初始化

解析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.kler.cn/a/411093.html

相关文章:

  • 【大数据学习 | Spark-Core】Spark的改变分区的算子
  • html渲染优先级
  • 重新定义社媒引流:AI社媒引流王如何为品牌赋能?
  • 5. Autogen官网教程 (Tool Use)
  • 破解天然气巡检挑战,构建智能运维体系
  • 跨平台应用开发框架(1)----Qt(组件篇)
  • Spark SQL大数据分析快速上手-Hive安装
  • 【设计模式】【行为型模式(Behavioral Patterns)】之命令模式(Command Pattern)
  • Vue进阶面试题(三)
  • Python和R统计检验比较各组之间的免疫浸润
  • 【IEEE出版 | ISBN: 979-8-3315-0796-1 | 高录用稳检索】 2025神经网络与智能优化国际研讨会(NNIO 2025)
  • 中国科学院大学研究生学术英语读写教程 Unit6 Biology TextA 原文和翻译
  • 对于公平与效率的关系问题,材料中有两种不同倾向性的观点,请对这两种观点分别加以概述并谈谈你的看法。字数不超过500字。
  • 上海乐鑫科技一级代理商飞睿科技,ESP32-C61高性价比WiFi6芯片高性能、大容量
  • 鸿蒙应用的基本架构
  • OpenTK 实现三维空间模型仿真详解
  • 基于Springboot的心灵治愈交流平台系统的设计与实现
  • RSA非对称加密解,支持分段加密解密、(公钥加密,私钥解密)、(私钥加密,公钥解密)
  • Bean的生命周期详解保姆级教程,结合spring boot和spring.xml两种方式讲解,5/7/10大小阶段详细分析
  • 基于Matlab卷积神经网络的肺癌检测系统(良性、恶性及正常病例分类的综合分析)
  • 【Vue3+Pinia】Vue新一代状态管理器Pinia
  • 三、计算机视觉_08YOLO目标检测
  • [仓颉Cangjie刷题模板] 优先队列(含小顶堆实现)
  • 开展网络安全成熟度评估:业务分析师的工具和技术
  • postgres-howto 学习笔记
  • 微信小程序学习指南从入门到精通