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

C/C++ JSON 库综合对比及应用案例(六)

第六部分:C/C++ JSON 库综合对比及应用案例

📢 快速掌握 JSON!文章 + 视频双管齐下 🚀

如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 JSON 课程视频!🎬 视频里会用更直观的方式讲解 JSON 的核心概念、实战技巧,并配有动手演示,让你更高效地掌握 JSON 的处理方法!

当然,如果你喜欢深度阅读,这篇文章会帮助你系统地理解 JSON,从基础到进阶!无论你选择哪种方式,最终目标都是让你成为 JSON 处理的高手!💪

🎥 点击这里观看视频 👉 视频链接

一:四种方式对比

cJSON vs. RapidJSON vs. JsonCpp vs. JSON for Modern C++

  • API 设计与易用性
  • 解析与序列化性能对比
  • 适用场景分析
  • 在实际项目中的选型建议
1.1 C/C++ JSON 解析库对比

在 C/C++ 中,以下 四大 JSON 解析库 是最常用的:

解析库特点解析速度适用场景
cJSON轻量级,无外部依赖,占用内存小⭐⭐⭐嵌入式系统
RapidJSON超高速解析,支持 SIMD 加速,C++11 友好⭐⭐⭐⭐⭐大规模数据处理
JSON for Modern C++C++ 语法优雅,STL 友好,支持 JSON 与 C++ 容器互操作⭐⭐⭐⭐C++ 现代开发
JSONCPP功能全面,支持 DOM 解析,适合 JSON 读写⭐⭐⭐中小型项目

📌 选择建议

  • 小型项目、嵌入式系统cJSON
  • 超大 JSON 数据RapidJSON
  • 现代 C++ 代码JSON for Modern C++
  • 综合功能JSONCPP

1.2 解析性能对比测试

💡 测试环境

  • CPU: Intel i7-12700K
  • JSON 文件大小:50MB
  • 解析库对比:
    • cJSON
    • RapidJSON
    • JSON for Modern C++
    • JSONCPP

📌 测试代码(解析 50MB JSON 文件)

#include <iostream>
#include <chrono>
#include <fstream>
#include <json/json.h>  // 使用 JSONCPP
#include "cJSON.h"
#include "rapidjson/document.h"
#include "nlohmann/json.hpp"using namespace std;
using json = nlohmann::json;
using namespace rapidjson;
using namespace std::chrono;void TestCJSON(const string& filename) {auto start = high_resolution_clock::now();ifstream file(filename);string jsonStr((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());cJSON* root = cJSON_Parse(jsonStr.c_str());if (!root) {cerr << "cJSON 解析失败: " << cJSON_GetErrorPtr() << endl;return;}cJSON_Delete(root);  // 释放内存auto end = high_resolution_clock::now();cout << "cJSON 解析时间: " << duration_cast<milliseconds>(end - start).count() << "ms" << endl;
}void TestJSONCPP(const string& filename) {auto start = high_resolution_clock::now();ifstream file(filename);Json::CharReaderBuilder reader;Json::Value root;string errs;if (!Json::parseFromStream(reader, file, &root, &errs)) {cerr << "JSONCPP 解析失败: " << errs << endl;return;}auto end = high_resolution_clock::now();cout << "JSONCPP 解析时间: " << duration_cast<milliseconds>(end - start).count() << "ms" << endl;
}void TestRapidJSON(const string& filename) {auto start = high_resolution_clock::now();ifstream file(filename);string jsonStr((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());Document doc;doc.Parse(jsonStr.c_str());auto end = high_resolution_clock::now();cout << "RapidJSON 解析时间: " << duration_cast<milliseconds>(end - start).count() << "ms" << endl;
}void TestNlohmannJSON(const string& filename) {auto start = high_resolution_clock::now();ifstream file(filename);json j;file >> j;auto end = high_resolution_clock::now();cout << "nlohmann::json 解析时间: " << duration_cast<milliseconds>(end - start).count() << "ms" << endl;
}int main() {string filename = "large.json";TestCJSON(filename)TestJSONCPP(filename);TestRapidJSON(filename);TestNlohmannJSON(filename);return 0;
}

📌 测试结果

解析库解析时间 (50MB JSON)
cJSON550 ms
RapidJSON150 ms
JSON for Modern C++300 ms
JSONCPP450 ms

📌 结论

  • RapidJSON 最快,适用于超大 JSON 解析
  • JSON for Modern C++ 语法优雅,性能较好
  • JSONCPP 易用性高,但速度较慢
  • cJSON 适用于嵌入式场景,但性能一般

二:JSON 解析性能瓶颈分析

在优化 JSON 解析之前,先了解性能瓶颈:

  • 文件大小 📁 → 解析大 JSON 文件时,可能会 占用大量内存

    问题:解析大 JSON 文件(如 100MB+)会占用大量 RAM,导致 内存溢出性能下降

    优化方案

    流式解析(SAX 方式) → 逐步读取,避免一次性加载整个文件
    增量解析 → 使用 内存映射文件(mmap) 读取大文件
    压缩存储 JSON → 采用 gzip 压缩,减少 I/O 读取时间

  • 嵌套层级 🌳 → 过深的 JSON 嵌套结构 增加解析复杂度

    问题:深层嵌套(如 10+ 层)导致:

    • 递归解析 耗时增加
    • 堆栈溢出风险

    优化方案

    避免深层嵌套 → 适当扁平化 JSON 结构
    使用迭代解析减少递归调用,降低栈消耗

  • 数据格式 📊 → 字符串 vs. 数字 vs. 数组,不同数据类型 解析速度不同

    问题:解析不同数据类型的耗时不同:

    • 字符串(慢):需要解析、拷贝、分配内存
    • 数字(快):整数解析比浮点数更高效
    • 数组(视大小):大数组可能导致过多分配

    优化方案

    避免 JSON 过多字符串(如 id: "12345" 改为 id: 12345
    使用二进制格式(CBOR、MessagePack),减少解析开销

  • 单线程限制 🚧 → 传统解析 单线程执行,容易成为 CPU 瓶颈

    问题:传统 JSON 解析单线程执行,性能受限于 CPU 单核

    优化方案

    多线程解析 JSON(将 JSON 划分成多个部分并并行解析)
    使用 SIMD 指令加速解析(如 RapidJSON 支持 SSE2AVX2

  • I/O 读取速度 ⚡ → 磁盘读取 JSON 可能比解析更慢,应优化 I/O

    问题:JSON 解析前,I/O 读取 JSON 文件 可能成为 性能瓶颈

    优化方案

    使用 mmap 直接映射文件,减少 I/O 拷贝
    缓存 JSON 数据,避免重复加载
    压缩 JSON 文件(gzip),减少磁盘读取时间

📌 总结:如何优化 JSON 解析?

瓶颈解决方案
大文件 📁SAX 解析 / 增量读取 / 压缩 JSON
深层嵌套 🌳优化 JSON 结构 / 迭代解析
数据格式 📊减少字符串 / 使用二进制格式
单线程 CPU 限制 🚧并行解析 / SIMD 加速
I/O 读取慢mmap / gzip 压缩
1.1 选择合适的 JSON 解析方式

不同的解析方式对性能影响较大,应该根据场景选择最优方案:

解析方式适用场景解析速度内存占用备注
DOM 解析(Document Model)小型 JSON(<10MB)加载到内存,支持增删改查
SAX 解析(事件驱动)超大 JSON(>100MB)逐行解析,适合流式数据
增量解析(Streaming)实时处理数据流中等适合日志、API 响应
二进制 JSON(CBOR/MessagePack)性能关键应用超快压缩存储,解析速度提升

推荐优化

  • 大文件(>100MB)SAX 解析
  • 流式数据(API、日志)增量解析
  • 高性能需求二进制 JSON
1.2 提高 I/O 读取性能

JSON 解析的瓶颈往往在 I/O 读取速度,优化 I/O 可显著提升解析速度:

✅ 方案 1:使用 mmap(内存映射文件)

🔹 ifstream 读取更快,避免 read() 拷贝数据到缓冲区
🔹 适用于 超大 JSON 文件(GB 级)

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>void* ReadJSONWithMMap(const char* filename, size_t& size) {int fd = open(filename, O_RDONLY);size = lseek(fd, 0, SEEK_END);  // 获取文件大小void* data = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);close(fd);return data;  // 返回指向 JSON 数据的指针
}

✅ 方案 2:使用 getline() + StringStream

🔹 逐行读取 JSON,减少内存拷贝

#include <iostream>
#include <fstream>
#include <sstream>std::string ReadJSONWithBuffer(const std::string& filename) {std::ifstream file(filename);std::ostringstream ss;ss << file.rdbuf();  // 直接读取到缓冲区return ss.str();
}

✅ 方案 3:JSON 文件压缩(gzip)

🔹 减少磁盘 I/O,提升读取速度 🔹 适用于 大规模日志存储(API 响应数据)

#include <zlib.h>std::string ReadGzipJSON(const std::string& filename) {gzFile file = gzopen(filename.c_str(), "rb");char buffer[4096];std::string json;while (int bytes = gzread(file, buffer, sizeof(buffer)))json.append(buffer, bytes);gzclose(file);return json;
}
1.3 高效解析 JSON

✅ 方案 1:SAX 解析(流式解析,超低内存占用)

🔹 适用于大 JSON 文件(>100MB)
🔹 事件驱动方式(类似 XML 解析),逐个处理 JSON 节点

#include "rapidjson/reader.h"
#include <iostream>class MyHandler : public rapidjson::BaseReaderHandler<rapidjson::UTF8<>, MyHandler> {
public:bool Key(const char* str, rapidjson::SizeType length, bool copy) {std::cout << "Key: " << std::string(str, length) << std::endl;return true;}bool String(const char* str, rapidjson::SizeType length, bool copy) {std::cout << "Value: " << std::string(str, length) << std::endl;return true;}
};void ParseLargeJSON(const std::string& json) {rapidjson::Reader reader;rapidjson::StringStream ss(json.c_str());MyHandler handler;reader.Parse(ss, handler);
}

✅ 方案 2:并行解析 JSON

🔹 多线程解析 JSON,适用于多核 CPU

#include <thread>
#include "rapidjson/document.h"void ParsePart(const std::string& jsonPart) {rapidjson::Document doc;doc.Parse(jsonPart.c_str());
}void ParallelParseJSON(const std::string& json) {std::thread t1(ParsePart, json.substr(0, json.size() / 2));std::thread t2(ParsePart, json.substr(json.size() / 2));t1.join();t2.join();
}

✅ 方案 3:使用 SIMD 加速

🔹 利用 AVX/SSE 指令加速 JSON 解析 🔹 RapidJSON 已经支持 SSE2 / AVX2

开启 SIMD 优化

#define RAPIDJSON_SSE2
#include "rapidjson/document.h"

1.4 使用二进制 JSON 格式(CBOR / MessagePack)

🔹 解析速度比普通 JSON 快 10 倍 🔹 减少 30-50% 存储占用

#include "nlohmann/json.hpp"
#include <fstream>void SaveBinaryJSON() {nlohmann::json j = {{"name", "Alice"}, {"age", 25}};std::ofstream file("data.cbor", std::ios::binary);file << nlohmann::json::to_cbor(j);
}

格式对比:

格式解析速度存储大小适用场景
JSON中等兼容性强
CBOR嵌入式
MessagePack超快超小高性能应用

1.5 其他优化技巧

✅ 1. 避免动态内存分配

🔹 使用 预分配缓冲区(如 MemoryPoolAllocator)减少 malloc() 调用

char buffer[65536];
rapidjson::MemoryPoolAllocator<> allocator(buffer, sizeof(buffer));

✅ 2. 批量处理 JSON

🔹 一次性解析多个 JSON,减少 parse() 调用次数
🔹 适用于日志、批量 API 响应

std::vector<std::string> jsonBatch = {...};  // 批量 JSON
std::vector<rapidjson::Document> docs;
docs.reserve(jsonBatch.size());
for (const auto& json : jsonBatch) {rapidjson::Document doc;doc.Parse(json.c_str());docs.push_back(std::move(doc));
}

🎯 结论:最佳 JSON 解析优化方案

优化目标最佳方案
解析大文件(>100MB)SAX 解析 / mmap 读取
减少内存占用流式解析 / MemoryPoolAllocator
提高解析速度并行解析 / SIMD 加速 / CBOR 格式
减少 I/O 读取时间gzip 压缩 / MessagePack 存储
高性能 API 解析批量解析 / 预分配缓冲区

三:多线程解析 JSON

📌 为什么使用多线程?

  • 并行解析大 JSON 文件,提升 CPU 利用率
  • 减少解析时间,特别适用于 大数组、多对象 JSON

示例:多线程解析 JSON

💡 数据示例

{"users": [{ "id": 1, "name": "Alice", "age": 25 },{ "id": 2, "name": "Bob", "age": 30 },{ "id": 3, "name": "Charlie", "age": 28 }]
}

📌 C++ 代码

#include <iostream>
#include <json/json.h>
#include <thread>
#include <vector>using namespace std;void ParseUser(Json::Value user) {cout << "ID: " << user["id"].asInt() << ", ";cout << "Name: " << user["name"].asString() << ", ";cout << "Age: " << user["age"].asInt() << endl;
}int main() {string jsonStr = R"({"users": [{"id": 1, "name": "Alice", "age": 25},{"id": 2, "name": "Bob", "age": 30},{"id": 3, "name": "Charlie", "age": 28}]})";Json::CharReaderBuilder reader;Json::Value root;string errs;istringstream iss(jsonStr);if (!Json::parseFromStream(reader, iss, &root, &errs)) {cerr << "JSON 解析错误: " << errs << endl;return 1;}vector<thread> threads;for (const auto& user : root["users"]) {threads.emplace_back(ParseUser, user);}for (auto& t : threads) {t.join();}return 0;
}

输出(多线程执行)

ID: 1, Name: Alice, Age: 25
ID: 2, Name: Bob, Age: 30
ID: 3, Name: Charlie, Age: 28

📌 优化点

  • 创建多个线程 并行解析 JSON 数组中的对象
  • 提升 CPU 利用率,适用于 大规模 JSON 数据

四:大数据 JSON 解析

优化方案

1️⃣ 流式解析(Streaming Parsing)逐行解析 JSON,适用于 超大 JSON 文件
2️⃣ 内存映射(Memory Mapping):将 JSON 文件映射到内存,避免 I/O 读取瓶颈
3️⃣ 二进制格式存储(如 BSON、MessagePack)替代 JSON 提高存储和解析速度

示例:流式解析大 JSON

💡 适用于 超大 JSON 文件(>1GB

#include <iostream>
#include <fstream>
#include <json/json.h>using namespace std;void StreamParseJSON(const string& filename) {ifstream file(filename);if (!file.is_open()) {cerr << "无法打开文件: " << filename << endl;return;}Json::CharReaderBuilder reader;Json::Value root;string errs;if (!Json::parseFromStream(reader, file, &root, &errs)) {cerr << "JSON 解析失败: " << errs << endl;return;}cout << "解析完成,用户总数: " << root["users"].size() << endl;
}int main() {StreamParseJSON("bigdata.json");return 0;
}

优势

  • 不会一次性加载整个 JSON 文件
  • 降低内存占用,适合超大 JSON 文件

五:JSON 在实际工程中的应用案例

  • 配置文件解析(读取和写入 JSON 配置文件)

  • 网络通信(JSON 在 HTTP API 交互中的应用)

  • 日志系统(如何利用 JSON 记录结构化日志)

  • 数据存储与序列化(将 C++ 结构体转换为 JSON 并存储)

实战项目:存储交易记录

📌 目标

  • 解析 金融交易数据
  • 多线程存储 JSON 交易记录数据库

💡 交易数据 JSON

{"transactions": [{ "id": 1001, "amount": 250.75, "currency": "USD", "timestamp": "2025-02-09T12:00:00Z" },{ "id": 1002, "amount": 500.00, "currency": "EUR", "timestamp": "2025-02-09T12:05:00Z" }]
}

📌 C++ 代码

#include <iostream>
#include <json/json.h>
#include <thread>
#include <vector>using namespace std;void ProcessTransaction(Json::Value txn) {cout << "交易ID: " << txn["id"].asInt() << ", ";cout << "金额: " << txn["amount"].asFloat() << " " << txn["currency"].asString() << ", ";cout << "时间: " << txn["timestamp"].asString() << endl;
}int main() {string jsonStr = R"({"transactions": [{ "id": 1001, "amount": 250.75, "currency": "USD", "timestamp": "2025-02-09T12:00:00Z" },{ "id": 1002, "amount": 500.00, "currency": "EUR", "timestamp": "2025-02-09T12:05:00Z" }]})";Json::CharReaderBuilder reader;Json::Value root;string errs;istringstream iss(jsonStr);if (!Json::parseFromStream(reader, iss, &root, &errs)) {cerr << "JSON 解析错误: " << errs << endl;return 1;}vector<thread> threads;for (const auto& txn : root["transactions"]) {threads.emplace_back(ProcessTransaction, txn);}for (auto& t : threads) {t.join();}return 0;
}

结果

交易ID: 1001, 金额: 250.75 USD, 时间: 2025-02-09T12:00:00Z
交易ID: 1002, 金额: 500.00 EUR, 时间: 2025-02-09T12:05:00Z

📌 总结

  • 使用多线程 加速 JSON 解析
  • 流式解析 处理 大 JSON 文件
  • 选择最优 JSON 解析器 🚀

实战案例:解析并存储 API 数据

案例:解析 GitHub API 并存储用户信息

📌 目标

  • 解析 GitHub API 用户信息
  • 存储到 MySQL
  • 多线程优化

💡 示例 API 响应

{"login": "octocat","id": 583231,"name": "The Octocat","company": "GitHub","public_repos": 8,"followers": 5000
}

📌 代码

#include <iostream>
#include <json/json.h>
#include <curl/curl.h>
#include <mysql/mysql.h>using namespace std;// 获取 HTTP 数据
size_t WriteCallback(void* contents, size_t size, size_t nmemb, string* output) {output->append((char*)contents, size * nmemb);return size * nmemb;
}string FetchGitHubUserData(const string& username) {string url = "https://api.github.com/users/" + username;CURL* curl = curl_easy_init();string response;if (curl) {curl_easy_setopt(curl, CURLOPT_URL, url.c_str());curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0");curl_easy_perform(curl);curl_easy_cleanup(curl);}return response;
}// 解析 JSON
void ParseGitHubUserData(const string& jsonData) {Json::CharReaderBuilder reader;Json::Value root;string errs;istringstream iss(jsonData);if (!Json::parseFromStream(reader, iss, &root, &errs)) {cerr << "JSON 解析失败: " << errs << endl;return;}cout << "GitHub 用户: " << root["login"].asString() << endl;cout << "公司: " << root["company"].asString() << endl;cout << "公开仓库: " << root["public_repos"].asInt() << endl;
}// 存储数据到 MySQL
void StoreToDatabase(const Json::Value& user) {MYSQL* conn = mysql_init(NULL);if (!mysql_real_connect(conn, "localhost", "root", "password", "test_db", 3306, NULL, 0)) {cerr << "MySQL 连接失败: " << mysql_error(conn) << endl;return;}string query = "INSERT INTO github_users (id, login, company, repos) VALUES (" +to_string(user["id"].asInt()) + ", '" + user["login"].asString() + "', '" +user["company"].asString() + "', " + to_string(user["public_repos"].asInt()) + ")";if (mysql_query(conn, query.c_str())) {cerr << "数据插入失败: " << mysql_error(conn) << endl;} else {cout << "数据成功存入数据库!" << endl;}mysql_close(conn);
}int main() {string jsonData = FetchGitHubUserData("octocat");ParseGitHubUserData(jsonData);Json::CharReaderBuilder reader;Json::Value root;string errs;istringstream iss(jsonData);Json::parseFromStream(reader, iss, &root, &errs);StoreToDatabase(root);return 0;
}

项目亮点

  • 使用 cURL 请求 GitHub API

  • 解析 JSON 并提取关键信息

  • 存储到 MySQL 数据库

  • 可扩展性强,可用于爬取其他 API

六:总结与展望

  • JSON 在 C/C++ 开发中的重要性
  • JSON 未来的发展趋势
  • 如何继续深入学习 JSON 相关技术
  • Q&A 互动交流

相关文章:

C/C++ JSON 库综合对比及应用案例(六)

第六部分&#xff1a;C/C JSON 库综合对比及应用案例 &#x1f4e2; 快速掌握 JSON&#xff01;文章 视频双管齐下 &#x1f680; 如果你觉得阅读文章太慢&#xff0c;或者更喜欢 边看边学 的方式&#xff0c;不妨直接观看我录制的 JSON 课程视频&#xff01;&#x1f3ac; …...

AI Agent拐点已至,2B+2C星辰大海——行业深度报告

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告&#xff0c;报告从AI Agent商业化应用、C端B端应用与布局&#xff0c;投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF&#xff0c;文末有完整版下载地址。 内容摘要 2025年…...

【CSS】- 表单控件的 placeholder 如何控制换行显示?

表单控件的 placeholder 如何换行展示&#xff1f; HTML 中&#xff0c;<textarea> 元素的 placeholder 属性默认情况下不支持换行。不过&#xff0c;可以通过以下几种方法来实现换行效果&#xff1a; 模版字符串 模板字符串可以轻松地创建多行字符串&#xff0c;而不…...

Mac 终端命令大全

—目录操作— ꔷ mkdir 创建一个目录 mkdir dirname ꔷ rmdir 删除一个目录 rmdir dirname ꔷ mvdir 移动或重命名一个目录 mvdir dir1 dir2 ꔷ cd 改变当前目录 cd dirname ꔷ pwd 显示当前目录的路径名 pwd ꔷ ls 显示当前目录的内容 ls -la ꔷ dircmp 比较两个目录的内容 d…...

常用天然地震链接

一些常用的天然地震链接汇总&#xff1a; 天然地震数据 - IRIS Wilber 3 DATA: NSF SAGE: Wilber 3: Select Event地震学入门知识 - 地震“学”网站&#xff1a;地震“学”地震数据处理Matlab code - github &#xff1a;The GISMO Toolbox - seismic data analysis in MATLAB…...

node.js、npm相关知识

Node.js 是一个基于 Chrome V8 JavaScript 引擎 构建的开源、跨平台的 JavaScript 运行时环境&#xff0c;主要用于服务器端编程。它允许开发者使用 JavaScript 编写高性能的后端服务&#xff0c;突破了 JavaScript 仅在浏览器中运行的限制。 npm&#xff08;Node Package Man…...

基于HTML5和CSS3实现3D旋转相册效果

基于HTML5和CSS3实现3D旋转相册效果 这里写目录标题 基于HTML5和CSS3实现3D旋转相册效果项目介绍技术栈核心功能实现原理1. HTML结构2. CSS样式设计2.1 基础样式设置2.2 容器样式2.3 图片样式 3. JavaScript实现4. 交互功能实现4.1 触摸和鼠标拖拽4.2 播放控制 项目亮点技术难点…...

‌在 Fedora 系统下备份远程 Windows SQL Server 数据库的完整方案

‌一、环境准备与工具安装‌ ‌1. 安装 Microsoft SQL Server 命令行工具‌ Fedora 需安装 mssql-tools 和 ODBC 驱动&#xff1a; # 添加 Microsoft 仓库 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安装工具包 …...

上市电子制造企业如何实现合规的质量文件管理?

浙江洁美电子科技股份有限公司成立于2001年&#xff0c;是一家专业为片式电子元器件(被动元件、分立器件、集成电路及LED)配套生产电子薄型载带、上下胶带、离型膜、流延膜等产品的国家高新技术企业&#xff0c;主要产品有分切纸带、打孔经带、压孔纸带、上下胶带、塑料载带及其…...

什么是SSE和websocket

以下是 SSE&#xff08;Server-Sent Events&#xff09; 和 WebSocket 在大模型&#xff08;如 ChatGPT&#xff09;流式输出中的实际例子对比&#xff0c;包含代码实现和场景分析&#xff1a; —### 1. SSE&#xff08;Server-Sent Events&#xff09;#### 场景 大模型生成文本…...

QT操作Word文档

虽然 Qt 没有原生支持 Word 文档操作的模块,但可以通过以下几种方式实现 Word 文档的读写和操作: 1、使用 ActiveX/COM (仅限 Windows) 2、使用第三方库 (跨平台),比如: libopendocument等。 3、直接操作 DOCX 文件 (DOCX 是 ZIP+XML) 4、使用 HTML 作为中介格式 一、使…...

Redis 源码硬核解析系列专题 - 第一篇:Redis源码入门与整体架构

1. 引言 Redis作为一个高性能的内存键值数据库,其源码以简洁高效著称。通过解析Redis源码,我们可以深入理解其单线程模型、事件驱动机制以及模块化设计的精髓。本篇将从Redis的源码目录结构入手,剖析其整体架构,并聚焦启动流程和事件循环的核心实现。 2. Redis源码目录结构…...

vscode中的【粘滞滚动】的基本概念和作用,关闭了以后如何开启

1、粘滞滚动的基本概念和作用 ‌VSCode中的“粘滞”功能主要是指编辑器在滚动时的一种特殊效果&#xff0c;使得编辑器在滚动到某个位置时会“粘”在那里&#xff0c;而不是平滑滚动到底部或顶部。‌ 粘滞滚动的基本概念和作用 粘滞滚动功能可以让用户在滚动时更直观地看到当前…...

APIPost接口测试完整流程指南

APIPost接口测试完整流程指南 APIPost是一款国产的API开发测试工具&#xff0c;结合了Postman、Swagger和Mock的功能。以下是详细的APIPost接口测试流程&#xff1a; 一、环境准备 下载安装 官网下载&#xff1a;Apipost-API 文档、设计、调试、自动化测试一体化协作平台 支…...

IDEA如何设置以新窗口打开新项目

在 IntelliJ IDEA 中设置以新窗口打开新项目&#xff0c;可以通过以下两种方式实现&#xff1a; 方法 1&#xff1a;通过对话框提示选择新窗口 打开项目时&#xff1a; 当通过 File > Open&#xff08;或欢迎界面点击 Open&#xff09;选择新项目时&#xff0c;IDEA 会弹出对…...

【含文档+PPT+源码】基于微信小程序的社交摄影约拍平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社交摄影约拍平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...

C#使用用户名密码连接共享文件夹

C#使用用户名密码连接共享文件夹 创建连接 using System.ComponentModel; using System.Runtime.InteropServices;namespace Tests.ConsoleApp {public class ShareDirectoryConnect : IDisposable{private static readonly HashSet<Guid> _TOKENS new HashSet<Gui…...

Springboot集成Dubbo和Zookeeper框架搭建

目录 1.搭建环境 2.搭建步骤 3.效果展示 4.注意项 1.搭建环境如下图所示&#xff1a; 2.搭建步骤 2.1 目标概述 一共三个服务,一个公共接口服务,一个提供者服务,一个消费者服务。最终以浏览器或者postman查询接口,实现订单信息回显。最终项目结构如图所示&#xff1a; 2.2 …...

发票管理自动化-发票查验接口让财务告别繁琐的核验流程

发票管理的效率与准确性直接影响着企业运营的顺畅性&#xff0c;在过去&#xff0c;财务人员查验发票时&#xff0c;需手工输入发票代码、号码、日期、金额、验证码等信息一张一张进行核验。整个过程不仅操作繁琐&#xff0c;而且极易出错。若遇到验证码难以辨认的情况&#xf…...

小程序28-事件传参-data-*自定义数据

事件传参&#xff1a;在触发事件时&#xff0c;将一些数据作为参数传递给事件处理函数的过程&#xff0c;就是事件传参 在微信小程序中&#xff0c;我们经常会在组件上添加一些自定义数据&#xff0c;然后在事件处理函数中获取这些自定义数据&#xff0c;从而完成业务逻辑的开…...

基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)

C#编写ModbusTcp类库,模拟plc进行本地通信测试 Modbus是一个应用层协议,常用于工业自动化设备之间的通信,主要有两种传输方式:RTU和TCP。 常见的功能码包括读取线圈(01)、读取离散输入(02)、读保持寄存器(03)、读输入寄存器(04)、写单个线圈(05)、写单个寄存器(…...

IS-IS:单区域集成配置与多区域集成配置

一、IS-IS概述 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09; 是一种链路状态内部网关协议&#xff08;IGP&#xff09;&#xff0c;设计用于自治系统&#xff08;AS&#xff09;内部的路由选择。最初由ISO为OSI模型的无连接网络服务&#xff08;…...

Open GL ES ->GLSurfaceView正交投影与透视投影方法中近远平面取值参考

坐标系 OpenGL ES使用右手坐标系&#xff0c;相机默认朝向负z方向 相机位置|vz轴<----- 0 -----> -near -----> -far -----不可见 可见区域 不可见裁剪规则 far>near>0&#xff0c;只有z值在[-far, -near]范围内的物体可见&#xff0c; 当z > -near…...

API 安全之认证鉴权

作者&#xff1a;半天 前言 API 作为企业的重要数字资源&#xff0c;在给企业带来巨大便利的同时也带来了新的安全问题&#xff0c;一旦被攻击可能导致数据泄漏重大安全问题&#xff0c;从而给企业的业务发展带来极大的安全风险。正是在这样的背景下&#xff0c;OpenAPI 规范…...

Gateway实战入门(四)、断言-请求头以及请求权重分流等

spring cloud-Gateway:断言-请求头以及请求权重分流等 一、断言Header信息要求项目前置环境要求案例一、断言-请求头信息-匹配X-Request-Id1、配置文件及代码2、测试案例二、断言-请求头信息-匹配API版本场景主要配置信息案例三、断言-请求头信息:匹配请求来源场景主要配置信…...

【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...

[测试] Google Test | 主流的 C 测试框架

目录 GoogleTest 2. 准备工作 3. 测试 4.怎么用 Attention is All You Need 写项目代码的时候 边写边测试 非常重要&#xff0c;这样可以帮助我们减少很多的问题。 这篇文章后面 主要以 GoogleTest 为例&#xff0c;进行介绍最近找了些 gtest 相关的资料,学习了下.后面主要…...

OpenCV 图形API(3)高层次设计概览

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 G-API 是一个异构框架&#xff0c;提供了统一的 API 来使用多个支持的后端编程图像处理流水线。 关键的设计理念是在指定使用哪些内核和设备时保持流…...

51单片机的五类指令(五)——位操作类指令

目录 一、位传送指令 1、MOV C, bit 2、MOV bit, C 3、位传送指令的应用场景 二、位变量修改指令 1、CLR&#xff08;清 0 指令&#xff09; 2、SETB&#xff08;置 1 指令&#xff09; 3、位变量修改指令的应用场景 三、位变量逻辑操作指令 1、位变量逻辑与指令 ANL…...

用python编写poc的流程

目录 一、POC 编写核心流程 二、常用 Python 库与工具 三、POC 框架推荐 四、高级优化技巧 五、安全规范与注意事项 六、实战案例&#xff1a;命令注入漏洞验证 一、POC 编写核心流程 漏洞分析 确定漏洞类型&#xff1a;根据目标特征判断漏洞类型&#xff08;如 SQL 注入、…...