C++ JSON库的使用示例

1. JSON 创建

(1)创建 JSON 对象

cpp 复制代码
json j;
j["name"] = "三三";
j["age"] = 20;
j["skills"] = { "C++", "Python", "Go" };

等效于:

json 复制代码
{
    "name": "三三",
    "age": 20,
    "skills": ["C++", "Python", "Go"]
}

(2)使用 initializer_list 直接构造

cpp 复制代码
json j = {
    {"name", "三三"},
    {"age", 20},
    {"skills", {"C++", "Python", "Go"}}
};

(3)创建 JSON 数组

cpp 复制代码
json arr = json::array({1, 2, 3, 4, 5});

等效于:

json 复制代码
[1, 2, 3, 4, 5]

2. 访问与修改 JSON

(1)访问 JSON 数据

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

(2)检查键是否存在

cpp 复制代码
if (j.contains("age")) {
    std::cout << "Age: " << j["age"] << std::endl;
}

(3)修改 JSON

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

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

(1)紧凑格式

cpp 复制代码
std::string compact = j.dump();
std::cout << compact << std::endl;

输出:

json 复制代码
{"name":"三三","age":21,"skills":["C++","Python","Go","Rust"],"city":"Shanghai"}

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

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

输出:

json 复制代码
{
    "name": "三三",
    "age": 21,
    "skills": [
        "C++",
        "Python",
        "Go",
        "Rust"
    ],
    "city": "Shanghai"
}

4. JSON 解析(反序列化)

(1)从字符串解析 JSON

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

(2)从文件读取 JSON

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

(3)写入 JSON 到文件

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

5. 遍历 JSON

(1)遍历对象

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

输出:

text 复制代码
name : "三三"
age : 21
skills : ["C++","Python","Go","Rust"]
city : "Shanghai"

(2)遍历数组

cpp 复制代码
for (auto& skill : j["skills"]) {
    std::cout << skill << std::endl;
}

输出:

text 复制代码
C++
Python
Go
Rust

6. JSON 与 STL 容器互转

(1)STL 容器转 JSON

cpp 复制代码
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 容器

cpp 复制代码
std::vector<int> vec = j.get<std::vector<int>>();

(3)map 转 JSON

cpp 复制代码
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

cpp 复制代码
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() 是否为数值

示例:

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

总结

功能 方法
创建 JSON json j = {``{"key", "value"}};
访问/修改 JSON j["key"]j["array"].push_back(value);
序列化 JSON j.dump()(紧凑格式)、j.dump(4)(美化格式)
解析 JSON json::parse(str)
遍历 JSON for(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 创建、访问、修改、序列化、反序列化、遍历、文件读写 等常见操作。


💻 示例代码

cpp 复制代码
#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

📌 运行结果

text 复制代码
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 数据

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

相关推荐
fleetstar2 分钟前
如何使用go本地编译caddy插件
开发语言·后端·golang
IT北辰8 分钟前
源码:用Python进行电影数据分析实战指南
开发语言·python
重生之成了二本看我逆天改命走向巅峰1 小时前
从0搭建Tomcat第二天:深入理解Servlet容器与反射机制
java·开发语言·笔记·学习·servlet·tomcat·idea
rkmhr_sef1 小时前
Java进阶:Dubbo
java·开发语言·dubbo
数维学长9861 小时前
【2025rust笔记】超详细,小白,rust基本语法
开发语言·笔记·rust
不止会JS1 小时前
cursor使用经验分享(java后端服务开发向)
java·开发语言·经验分享·cursor
徐白11771 小时前
Rust WebAssembly 入门教程
开发语言·rust·wasm
solomonzw1 小时前
C++ 学习(八)(模板,可变参数模板,模板专业化(完整模板专业化,部分模板专业化),类型 Traits,SFINAE(替换失败不是错误),)
c语言·开发语言·c++·学习
阳洞洞1 小时前
“nullptr“ should be used to denote the null pointer
开发语言·c++
攻城狮7号2 小时前
【第15节】C++设计模式(行为模式)-State(状态)模式
c++·设计模式·状态模式