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

C++ JSON库的使用示例

1. JSON 创建

(1)创建 JSON 对象

json j;
j["name"] = "三三";
j["age"] = 20;
j["skills"] = { "C++", "Python", "Go" };

等效于:

{
    "name": "三三",
    "age": 20,
    "skills": ["C++", "Python", "Go"]
}

(2)使用 initializer_list 直接构造

json j = {
    {"name", "三三"},
    {"age", 20},
    {"skills", {"C++", "Python", "Go"}}
};

(3)创建 JSON 数组

json arr = json::array({1, 2, 3, 4, 5});

等效于:

[1, 2, 3, 4, 5]

2. 访问与修改 JSON

(1)访问 JSON 数据

std::string name = j["name"];   // "三三"
int age = j["age"];             // 20
std::string skill = j["skills"][0];  // "C++"

(2)检查键是否存在

if (j.contains("age")) {
    std::cout << "Age: " << j["age"] << std::endl;
}

(3)修改 JSON

j["age"] = 21;
j["skills"].push_back("Rust"); // 添加新技能
j["city"] = "Shanghai"; // 新增字段

3. JSON 转字符串(序列化)

(1)紧凑格式

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

输出:

{"name":"三三","age":21,"skills":["C++","Python","Go","Rust"],"city":"Shanghai"}

(2)美化格式(带缩进)

std::string pretty = j.dump(4); // 4 代表缩进空格数
std::cout << pretty << std::endl;

输出:

{
    "name": "三三",
    "age": 21,
    "skills": [
        "C++",
        "Python",
        "Go",
        "Rust"
    ],
    "city": "Shanghai"
}

4. JSON 解析(反序列化)

(1)从字符串解析 JSON

std::string jsonStr = R"({"name":"三三","age":20,"skills":["C++","Python"]})";
json parsed = json::parse(jsonStr);
std::cout << parsed["name"] << std::endl; // "三三"

(2)从文件读取 JSON

std::ifstream file("data.json");
json j;
file >> j;  // 直接流输入到 JSON 对象
file.close();

(3)写入 JSON 到文件

std::ofstream outFile("output.json");
outFile << j.dump(4); // 美化格式写入
outFile.close();

5. 遍历 JSON

(1)遍历对象

for (auto& [key, value] : j.items()) {
    std::cout << key << " : " << value << std::endl;
}

输出:

name : "三三"
age : 21
skills : ["C++","Python","Go","Rust"]
city : "Shanghai"

(2)遍历数组

for (auto& skill : j["skills"]) {
    std::cout << skill << std::endl;
}

输出:

C++
Python
Go
Rust

6. JSON 与 STL 容器互转

(1)STL 容器转 JSON

std::vector<int> nums = {1, 2, 3, 4, 5};
json j = nums;  // 直接转换
std::cout << j.dump() << std::endl;  // [1,2,3,4,5]

(2)JSON 转 STL 容器

std::vector<int> vec = j.get<std::vector<int>>();

(3)map 转 JSON

std::map<std::string, int> myMap = {{"A", 1}, {"B", 2}};
json j = myMap;
std::cout << j.dump() << std::endl;  // {"A":1,"B":2}

(4)JSON 转 map

std::map<std::string, int> parsedMap = j.get<std::map<std::string, int>>();

7. JSON 其他常用方法

方法说明
j.empty()检查 JSON 是否为空
j.size()获取 JSON 元素数量
j.clear()清空 JSON
j.erase("key")删除指定 key
j.is_object()是否为对象
j.is_array()是否为数组
j.is_string()是否为字符串
j.is_number()是否为数值

示例:

if (j.is_object()) {
    std::cout << "这是一个 JSON 对象" << std::endl;
}

总结

功能方法
创建 JSONjson j = {{"key", "value"}};
访问/修改 JSONj["key"]j["array"].push_back(value);
序列化 JSONj.dump()(紧凑格式)、j.dump(4)(美化格式)
解析 JSONjson::parse(str)
遍历 JSONfor(auto& [k, v] : j.items())
JSON 与 STL 互转json j = vec;std::map<std::string, int> m = j.get<std::map<std::string, int>>();

完整示例:C++ 使用 nlohmann/json

这个示例演示了 JSON 创建、访问、修改、序列化、反序列化、遍历、文件读写 等常见操作。


💻 示例代码

#include <iostream>
#include <fstream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() {
    // 1. 创建 JSON 数据
    json j;
    j["name"] = "三三";
    j["age"] = 20;
    j["skills"] = {"C++", "Python", "Go"};
    j["address"] = { {"city", "Shanghai"}, {"zip", "200000"} };

    // 2. 访问 JSON 数据
    std::cout << "Name: " << j["name"] << std::endl;
    std::cout << "Age: " << j["age"] << std::endl;
    std::cout << "First Skill: " << j["skills"][0] << std::endl;
    std::cout << "City: " << j["address"]["city"] << std::endl;

    // 3. 修改 JSON 数据
    j["age"] = 21;
    j["skills"].push_back("Rust");  // 添加新技能
    j["address"]["district"] = "Pudong";  // 添加新字段

    // 4. JSON 转字符串(序列化)
    std::string jsonString = j.dump(4); // 美化格式
    std::cout << "Serialized JSON:\n" << jsonString << std::endl;

    // 5. 写入 JSON 到文件
    std::ofstream outFile("output.json");
    if (outFile.is_open()) {
        outFile << jsonString;
        outFile.close();
    }

    // 6. 从字符串解析 JSON(反序列化)
    std::string jsonStr = R"({"status":"ok","message":"success","userId":123})";
    json parsedJson = json::parse(jsonStr);
    std::cout << "Parsed Message: " << parsedJson["message"] << std::endl;

    // 7. 从文件读取 JSON
    std::ifstream inFile("output.json");
    if (inFile.is_open()) {
        json readJson;
        inFile >> readJson;
        inFile.close();
        std::cout << "Read JSON from file:\n" << readJson.dump(4) << std::endl;
    }

    // 8. 遍历 JSON 对象
    std::cout << "Traversing JSON object:" << std::endl;
    for (auto& [key, value] : j.items()) {
        std::cout << key << " : " << value << std::endl;
    }

    return 0;
}

📌 代码解析

  1. 创建 JSON

    • j["name"] = "三三"; 直接赋值创建 JSON 数据
    • 嵌套对象 j["address"] = { {"city", "Shanghai"}, {"zip", "200000"} };
    • 数组 j["skills"] = {"C++", "Python", "Go"};
  2. 访问 & 修改 JSON

    • std::cout << j["name"]; 访问 JSON 数据
    • j["age"] = 21; 修改 JSON
    • j["skills"].push_back("Rust"); 动态添加数组元素
  3. 序列化 & 反序列化

    • std::string jsonString = j.dump(4); 转字符串(美化格式)
    • json parsedJson = json::parse(jsonStr); 解析 JSON
  4. 文件读写

    • std::ofstream outFile("output.json"); 写入文件
    • std::ifstream inFile("output.json"); 读取文件
  5. 遍历 JSON

    • for (auto& [key, value] : j.items()) 遍历 JSON

📌 运行结果

Name: 三三
Age: 20
First Skill: C++
City: Shanghai
Serialized JSON:
{
    "name": "三三",
    "age": 21,
    "skills": [
        "C++",
        "Python",
        "Go",
        "Rust"
    ],
    "address": {
        "city": "Shanghai",
        "zip": "200000",
        "district": "Pudong"
    }
}
Parsed Message: success
Read JSON from file:
{
    "name": "三三",
    "age": 21,
    "skills": [
        "C++",
        "Python",
        "Go",
        "Rust"
    ],
    "address": {
        "city": "Shanghai",
        "zip": "200000",
        "district": "Pudong"
    }
}
Traversing JSON object:
name : "三三"
age : 21
skills : ["C++","Python","Go","Rust"]
address : {"city":"Shanghai","zip":"200000","district":"Pudong"}

✅ 你学到了什么?

  1. json 创建、访问、修改
  2. dump() 序列化 & parse() 反序列化
  3. JSON 读写文件
  4. 遍历 JSON 数据

你可以直接复制这段代码,运行看看!🚀


文章转载自:

http://wPcF0nZt.gyLzn.cn
http://5QEb7hmH.gyLzn.cn
http://RxPAhoIK.gyLzn.cn
http://nCYfKsoP.gyLzn.cn
http://p8Fw6LIQ.gyLzn.cn
http://zb6QRm2i.gyLzn.cn
http://LLa3cTOb.gyLzn.cn
http://F7Ej3JND.gyLzn.cn
http://tILnGWzg.gyLzn.cn
http://kRHbJlUB.gyLzn.cn
http://PdhMHvAs.gyLzn.cn
http://TwVfzbuI.gyLzn.cn
http://1Z4vEAtz.gyLzn.cn
http://iUl36HIy.gyLzn.cn
http://scgXICZT.gyLzn.cn
http://3uKOT67t.gyLzn.cn
http://NF2wZ2vf.gyLzn.cn
http://egEVG64w.gyLzn.cn
http://wNMCQHcB.gyLzn.cn
http://aeKFrY3R.gyLzn.cn
http://khnqfoSX.gyLzn.cn
http://7imeimlY.gyLzn.cn
http://IHbj2JDw.gyLzn.cn
http://aSoNHBn8.gyLzn.cn
http://wGTgcGFy.gyLzn.cn
http://QjviMDIG.gyLzn.cn
http://Rx26HIzT.gyLzn.cn
http://2eTNV7At.gyLzn.cn
http://1NdwEatH.gyLzn.cn
http://FmvRKvtT.gyLzn.cn
http://www.dtcms.com/a/52533.html

相关文章:

  • MambaMorph:基于 Mamba 的医学 MR-CT 可变形配准框架
  • scBaseCamp:一个AI代理的可持续扩充的单细胞数据存储库
  • Huggingface transformers库使用教程(翻译)--------(2)使用piplines进行推理
  • IDC权威认证!永洪科技入选 IDC「GBI图谱」,点亮生成式 BI 价值灯塔
  • 【Linux】使用问题汇总
  • MySQL-多表查询
  • 模拟数据文件少写“+”加在本地如何恢复?
  • Java 实现 Oracle 的 MONTHS_BETWEEN 函数
  • 在PyCharm开发环境中,如何建立hello.py文件?
  • 小菜鸟系统学习Python-迭代实现斐波那契和汉诺塔问题
  • C语言——链表
  • 国产替代新篇章:领麦微红外测温传感器赋能3D打印精准制造
  • 开启科创服务新篇章:八月瓜科技CRM数字化管理系统成功上线
  • 永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型
  • 从数据到决策,永洪科技助力良信电器“智”领未来
  • 【CV001】归一化互相关模板匹配matlab实现
  • 【漫话机器学习系列】120.参数化建模(Parametric Modeling)
  • PHP动态网站建设
  • Linux内存分页:原理、优势与实践
  • pytest框架 核心知识的系统复习
  • vulnhub靶场之【digitalworld.local系列】的mercy靶机
  • c++变量和声明的语法总结
  • 塔能物联运维:城市照明极端天气下的“定海神针”
  • 计算机毕设-基于springboot的网上商城系统的设计与实现(附源码+lw+ppt+开题报告)
  • CoreDNS 可观测最佳实践
  • /***************************所有笔记汇总目录***************************/
  • 【卫星语音通信】神经网络语音编解码算法:AudioDec
  • vtk 3D坐标标尺应用 3D 刻度尺
  • DeepSeek架构革命:动态异构计算
  • Ubuntu22.04安装Ollama部署DeepSeek-R1:32B模型