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

C++第三方库【JSON】nlohman/json

文章目录

  • 优势
  • 使用
  • API
    • 从文件中读取json
    • 从json文本创建json对象
    • 直接创建并操作json对象
    • 字符串 <=> json对象
    • 文件流 <=> json对象
    • 从迭代器读取
    • 像使用STL一样的访问
    • STL容器转化为 json数组
    • STL容器 转 json对象
    • 自定义类型转化为 json对象
  • 限制

优势

  • 直观的语法:json的使用像是使用一个STL容器
  • 简单的引入:仅需要包含一个json.hpp头文件,不需要库,没有子项目,没有依赖项,没有复杂的构建系统。使用原版C++11编写。加快开发速度
  • 内存效率:经过严格的单元测试,没有内存泄露;每个JSON对象的开销为一个指针和一个枚举元素(1个字节)。默认泛化使用以下C++数据类型:字符串、数字、对象、数组、布尔值。但也可以根据需要对Generalized类进行模板化(std::string、int64_t、uint64_t、double、std::map、std::vectort、bool、basic_json)

使用

直接包含

dir/
└── nlohmann├── json_fwd.hpp└── json.hpp
└── a.cpp

一般只要包含json.hpp,如果需要forward-declarations,那么可以包含json_fwd.hpp

注意,因为库使用了C++11,所以编译的时候需要使用C++11以上的标准编译

#include <iostream>
#include "nlohmann/json.hpp"using json = nlohmann::json;int main()
{// 使用不同类型的默认值创建JSON值json j_null(json::value_t::null);json j_boolean(json::value_t::boolean);json j_number_integer(json::value_t::number_integer);json j_number_float(json::value_t::number_float);json j_object(json::value_t::object);json j_array(json::value_t::array);json j_string(json::value_t::string);// 序列化JSON值std::cout << j_null << '\n';std::cout << j_boolean << '\n';std::cout << j_number_integer << '\n';std::cout << j_number_float << '\n';std::cout << j_object << '\n';std::cout << j_array << '\n';std::cout << j_string << '\n';
}

运行结果:

$./a.out 
null
false
0
0.0
{}
[]
""

API

从文件中读取json

自动解析文件中的JSON,创建一个json对象

#include <fstream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;std::ifstream f("example.json");
json data = json::parse(f);

从json文本创建json对象

假设要通过下述的json文本创建json对象

{"pi": 3.141,"happy": true
}

方法:

// 使用原始字符串
json ex1 = json::parse(R"({"pi": 3.141,"happy": true}
)");// 直接赋值字符串,需要带上_json !!!
using namespace nlohmann::literals;
json ex2 = R"({"pi": 3.141,"happy": true}
)"_json;// 使用列表初始化
json ex3 = {{"happy", true},{"pi", 3.141},
};

直接创建并操作json对象

假设要通过下述json文本创建json对象
注意:不能带注释,对象/数组的最后一个元素后不要有,(逗号)

{"pi": 3.141,"happy": true,"name": "Niels","nothing": null,"answer": {"everything": 42},"list": [1, 0, 2],"object": {"currency": "USD","value": 42.99}
}

构建方法:

// 创建一个空的结构体
json j;// 添加一个存储为double的数字(注意j到object的转换)
j["pi"] = 3.141;// 添加一个bool值,存储为bool
j["happy"] = true;// 添加一个字符串,存储为std::string
j["name"] = "Niels";// 添加null对象
j["nothing"] = nullptr;// 添加嵌套对象
j["answer"]["everything"] = 42;// 添加一个数组,存储为std::vector(列表初始化)
j["list"] = { 1, 0, 2 };// 添加另一个对象(使用列表初始化)
j["object"] = { {"currency", "USD"}, {"value", 42.99} };// 直接通过列表创建
json j2 = {{"pi", 3.141},{"happy", true},{"name", "Niels"},{"nothing", nullptr},{"answer", {{"everything", 42}}},{"list", {1, 0, 2}},{"object", {{"currency", "USD"},{"value", 42.99}}}
};

字符串 <=> json对象

字符串 => json对象
从字符串反序列化到 json 对象,需要使用_json

// create object from string literal
json j = "{ \"happy\": true, \"pi\": 3.141 }"_json;// or even nicer with a raw string literal
auto j2 = R"({"happy": true,"pi": 3.141}
)"_json;

如果不加 _json,则不会解析传递的字符串文本,而只是用作 json 字符串。
使用 _json 需要先展开命名空间

using namespace nlohman::literals

上述例子同样可以使用 json::parse() 转化

auto j3 = json::parse(R"({"happy": true, "pi": 3.141})");

json对象 => 字符串

std::string s = j.dump();    // {"happy":true,"pi":3.141}// 序列化到好看的格式
// 传入要缩进的空格数
std::cout << j.dump(4) << std::endl;
// {
//     "happy": true,
//     "pi": 3.141
// }

注意序列化和赋值的区别

// 存储一个字符串
json j_string = "this is a string";// 转化为字符串导出
auto cpp_string = j_string.template get<std::string>();
// 适配变量的类型导出(当变量已存在时为 alternative)
std::string cpp_string2;
j_string.get_to(cpp_string2);// 序列化
std::string serialized_string = j_string.dump();// 这三个字符串是相等的
std::cout << cpp_string << " == " << cpp_string2 << " == " << j_string.template get<std::string>() << '\n';
// 这两个字符串是相等的
std::cout << j_string << " == " << serialized_string << std::endl;

该库仅支持 UTF-8。当在库中存储不同编码的字符串时,调用dump可能会引发异常json::error_handler_t::replacejson::error_handler_t::ignore

文件流 <=> json对象

还可以使用 streams 进行序列化和反序列化:

// 从标准输入反序列化
json j;
std::cin >> j;// 通过标准输出序列化
std::cout << j;// 格式控制,重载了setw
std::cout << std::setw(4) << j << std::endl;

也适用于 stream 的子类。比如std::istreamstd::ostream

// 读一个json文件
std::ifstream i("file.json");
json j;
i >> j;// 将美化的json写到另一个文件
std::ofstream o("pretty.json");
o << std::setw(4) << j << std::endl;

从迭代器读取

还可以从迭代器范围解析 JSON
从迭代器可访问的任何容器中,其整数类型为 1、2 或 4 字节,将分别解释为 UTF-8、UTF-16 和 UTF-32。例如uint8_t、uint16_t

std::vector<std::uint8_t> v = {'t', 'r', 'u', 'e'};
json j = json::parse(v.begin(), v.end());

像使用STL一样的访问

// 通过push_back创建数组
json j;
j.push_back("foo");
j.push_back(1);
j.push_back(true);// 也可以emplace_back
j.emplace_back(1.78);// 通过迭代器访问json数组
for (json::iterator it = j.begin(); it != j.end(); ++it) {std::cout << *it << '\n';
}// 范围for
for (auto& element : j) {std::cout << element << '\n';
}// 访问和设置
const auto tmp = j[0].template get<std::string>();
j[1] = 42;
bool foo = j.at(2);// 比较
j == R"(["foo", 1, true, 1.78])"_json;  // true// 其他方法
j.size();     // 4 entries
j.empty();    // false
j.type();     // json::value_t::array
j.clear();    // the array is empty again// 类型检查
j.is_null();
j.is_boolean();
j.is_number();
j.is_object();
j.is_array();
j.is_string();// 创建对象
json o;
o["foo"] = 23;
o["bar"] = false;
o["baz"] = 3.141;// 也可以使用emplace
o.emplace("weather", "sunny");// 对象迭代器
for (json::iterator it = o.begin(); it != o.end(); ++it) {std::cout << it.key() << " : " << it.value() << "\n";
}// 范围for
for (auto& el : o.items()) {std::cout << el.key() << " : " << el.value() << "\n";
}// 结构化绑定
for (auto& [key, value] : o.items()) {std::cout << key << " : " << value << "\n";
}// 查找元素
if (o.contains("foo")) {// there is an entry with key "foo"
}// 查找到结尾
if (o.find("foo") != o.end()) {// there is an entry with key "foo"
}// 返回个数
int foo_present = o.count("foo"); // 1
int fob_present = o.count("fob"); // 0// 删除元素
o.erase("foo");

STL容器转化为 json数组

  std::vector<int> c_vector{1, 2, 3, 4};json j_vec(c_vector);std::cout << j_vec << '\n';std::deque<double> c_deque{1.2, 2.3, 3.4, 5.6};json j_deque(c_deque);std::cout << j_deque << '\n';std::list<bool> c_list{true, true, false, true};json j_list(c_list);std::cout << j_list << '\n';std::forward_list<int64_t> c_flist{12345678909876, 23456789098765,34567890987654, 45678909876543};json j_flist(c_flist);std::cout << j_list << '\n';std::array<unsigned long, 4> c_array{{1, 2, 3, 4}};json j_array(c_array);std::cout << j_array << '\n';std::set<std::string> c_set{"one", "two", "three", "four", "one"};json j_set(c_set); // 只有一个"one"std::cout << j_set << '\n';std::unordered_set<std::string> c_uset{"one", "two", "three", "four", "one"};json j_uset(c_uset); // 只有一个"one"std::cout << j_uset << '\n';std::multiset<std::string> c_mset{"one", "two", "one", "four"};json j_mset(c_mset); // 有多个"one"std::cout << j_mset << '\n';std::unordered_multiset<std::string> c_umset{"one", "two", "one", "four"};json j_umset(c_umset); // 有多个"one"std::cout << j_umset << '\n';

STL容器 转 json对象

  std::map<std::string, int> c_map{{"one", 1}, {"two", 2}, {"three", 3}};json j_map(c_map);std::cout << j_map << '\n';std::unordered_map<const char *, double> c_umap{{"one", 1.2}, {"two", 2.3}, {"three", 3.4}};json j_umap(c_umap);std::cout << j_umap << '\n';std::multimap<std::string, bool> c_mmap{{"one", true}, {"two", true}, {"three", false}, {"three", true}};json j_mmap(c_mmap); // 只有一个"three"对象std::cout << j_mmap << '\n';std::unordered_multimap<std::string, bool> c_ummap{{"one", true}, {"two", true}, {"three", false}, {"three", true}};json j_ummap(c_ummap); // 只有一个"three"对象std::cout << j_ummap << '\n';

自定义类型转化为 json对象

假设有如下类

namespace ns{struct person {std::string name;std::string address;int age;};
}

实现如下两个方法,即可支持 person 直接转化为 json 对象

using json = nlohmann::json;namespace ns{void to_json(json& j, const person& p) {j = json{{"name", p.name}, {"address", p.address}, {"age", p.age}};}void from_json(const json& j, person& p) {j.at("name").get_to(p.name);j.at("address").get_to(p.address);j.at("age").get_to(p.age);}
}

即可

// 创建一个person对象
ns::person p {"Ned Flanders", "744 Evergreen Terrace", 60};// 将 person 对象转化为 json 对象
json j = p;std::cout << j << std::endl;
// {"address":"744 Evergreen Terrace","age":60,"name":"Ned Flanders"}// 将 json 对象转化为 person 对象
auto p2 = j.template get<ns::person>();// 相等的
assert(p == p2);

注意:

  • to_jsonfrom_json 必须要位于要适配的自定义类的命名空间,不然库找不到,示例中都放到了 ns 中
  • 在方法中,使用at(),而不是.,如果键不在,会引发异常以便处理
  • 必须都为内置类型,自定义类型还需要实现上述两个方法

限制

  • 只支持UTF-8作为输入
  • 不支持json注释
  • 默认不保证 json 中 key 的顺序,即打印的key的顺序是随机的。如果要支持,使用 nlohmann::ordered_json 试试。

以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

相关文章:

C++第三方库【JSON】nlohman/json

文章目录 优势使用API从文件中读取json从json文本创建json对象直接创建并操作json对象字符串 <> json对象文件流 <> json对象从迭代器读取像使用STL一样的访问STL容器转化为 json数组STL容器 转 json对象自定义类型转化为 json对象 限制 优势 直观的语法&#xff…...

从源码到实战:深度解析`rsync`增量同步机制与高级应用

从源码到实战&#xff1a;深度解析rsync增量同步机制与高级应用 #mermaid-svg-C1ZMwvhtq4iP4E8m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-C1ZMwvhtq4iP4E8m .error-icon{fill:#552222;}#mermaid-svg-C1ZMwvht…...

数据库表设计五层分类系统表设计

文章目录 数据库表设计五层分类系统表设计代码思路详解类概述核心方法详解1. processString(String input) 方法2. createNo(String input, boolean peerNode) 方法3. isParent(String parentNo, String sonNo) 方法 编号系统设计使用场景推测代码特点可能的使用示例 NoProcess…...

Centos/RedHat 7.x服务器挂载ISCSI存储示例(无多路径非LVM)

客户让帮忙挂载个ISCSI存储&#xff0c;大概结构如下图所示&#xff1a; ISCSI存储为一台安装了truenas的X86服务器&#xff0c;提供存储服务的IP地址为10.16.0.1 服务器的ETH1网卡配置与10.16.0.1同段网络。 为了给客户做个简单培训&#xff0c;整理了一下操作步骤。下面是配…...

【android bluetooth 协议分析 21】【ble 介绍 2】【什么是IRK,是如何生成和传递的】

1. 什么是 IRK&#xff1f; IRK&#xff0c;全称 Identity Resolving Key&#xff08;身份解析密钥&#xff09;&#xff0c;是 BLE 设备用于生成和解析 Resolvable Private Address&#xff08;RPA&#xff09; 的密钥。 2. IRK 的生成和传递过程 IRK 是在 BLE 配对&#xf…...

4.14-4.15学习总结 IO流:缓冲流+转换流+序列化流+打印流+压缩流+Commons—io工具包+Hutool工具包

图片加密操作&#xff1a; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class test {public static void main(String[] args) throws IOException {FileInputStream fisnull;FileOutputStream fosnull;try{fisnew…...

Linux入门学习笔记

一、文件路径相关 相对路径与绝对路径 相对路径&#xff1a;是从当前工作目录开始表示文件或目录位置的路径。例如&#xff0c;当前在 /home/user 目录下&#xff0c;若要访问 user 目录下 test 文件夹中的 file.txt 文件&#xff0c;相对路径就是 test/file.txt 。它依赖于当…...

Redis适用场景

Redis适用场景 一、加速缓存二、会话管理三、排行榜和计数器四、消息队列五、实时分析六、分布式锁七、地理位置数据八、限流九、数据共享十、签到 一、加速缓存 Redis最常见的应用之一是作为缓存层&#xff0c;用于存储频繁访问的数据&#xff0c;从而减轻数据库的负载。 通过…...

# WPS打开新文档,“工具”菜单下是空白

WPS打开新文档&#xff0c;“工具”菜单下是空白 在 WPS 中打开新文档后 “工具” 菜单下空白&#xff0c;可能由多种原因导致&#xff0c;如下图&#xff1a; 下面分析并给出对应的解决办法&#xff1a; 一、 功能区显示设置问题 1、原因&#xff1a; WPS 的功能区显示可能…...

【软考-架构】13.3、架构复用-DSSA-ABSD

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 1、软件架构复用2、特定领域软件架构DSSADSSA的三个基本活动参与DSSA的四种角色人员建立DSSA的过程三层次模型 考试真题第一题第二题 3、基于架构的软件开发ABSD的软件开发…...

K8S_ResourceQuota与LimitRange的作用

ResourceQuota 作用详解 资源总量控制&#xff1a;ResourceQuota能对命名空间内的资源使用总量进行限制。在一个Kubernetes集群中&#xff0c;存在多个命名空间&#xff0c;每个命名空间可看作一个独立的工作单元。通过设置ResourceQuota&#xff0c;可以防止某个命名空间过度…...

T101D加固平板电脑:无人机地面站的高效智能控制核心

随着无人机技术在应急救援、农业监测、军事侦察等领域的广泛应用&#xff0c;对地面控制设备的要求也日益提高。鲁成伟业推出的T101D加固平板电脑凭借其高性能、强防护和专业化设计&#xff0c;成为无人机地面站的核心控制终端&#xff0c;为复杂环境下的作业提供了可靠支持。 …...

LLM中的N-Gram、TF-IDF和Word embedding

文章目录 1. N-Gram和TF-IDF&#xff1a;通俗易懂的解析1.1 N-Gram&#xff1a;让AI学会"猜词"的技术1.1.1 基本概念1.1.2 工作原理1.1.3 常见类型1.1.4 应用场景1.1.5 优缺点 1.2 TF-IDF&#xff1a;衡量词语重要性的尺子1.2.1 基本概念1.2.2 计算公式1.2.3 为什么需…...

【基于Servlet技术处理表单】

文章目录 一、实验背景与目的二、实验设计与实现思路1. 功能架构2. 核心代码实现3. 测试用例 总结 一、实验背景与目的 本次实验旨在深入理解Servlet工作原理&#xff0c;掌握JSP与Servlet的协同开发&#xff0c;实现前端表单与后端数据处理的交互。具体目标包括&#xff1a;设…...

【差分隐私相关概念】瑞丽差分隐私(RDP)-瑞丽散度约束了贝叶斯因子后验变化

分步解释和答案&#xff1a; 在Rnyi差分隐私&#xff08;RDP&#xff09;框架中&#xff0c;通过贝叶斯因子和Rnyi散度的关系可以推导出关于后验变化的概率保证。以下是关键步骤的详细解释&#xff1a; 1. 贝叶斯因子的定义与分解 设相邻数据集 D D D 和 D ′ D D′&#x…...

Oracle查询大表的全部数据

2000w的大表 表结构如下&#xff0c;其中id是索引 查询处理慢的写法 List<String> queryLoidForPage(Integer startNum,Integer endNum){try {Connection oracleConnection initBean.oracleConnection;Statement stmt oracleConnection.createStatement();// 4.执行查…...

linux 内核 static-key机制分析

1、static key是什么 Linux内核的 Static Keys机制是一种高效的条件分支优化技术,主要用于在运行时动态启用或禁用特定代码路径,同时‌避免常规条件判断(如 if 语句)的性能开销‌。它通过结合编译时优化和运行时代码修补(如 Jump Label 技术)实现近乎零成本的开关切换,广泛应用…...

【Java学习】Knife4j使用流程

手动添加依赖&#xff0c;并刷新Maven <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>4.3.0</version> </dependency>在配置文件application.…...

Java 基本操作快速入门:理解与实践

在软件开发的世界里&#xff0c;Java 作为一种广泛使用的编程语言&#xff0c;已经成为构建企业级应用、移动应用甚至大型系统的主力军。对于任何一位初学者来说&#xff0c;理解 Java 的基本操作是学习编程的第一步。从变量声明到控制流的结构&#xff0c;每一个基础知识点都是…...

jetson orin nano 开发板conda 的 base 环境在 shell 启动时自动激活

使用MobaXterm_Personal_23.0.exe 连接jetson开发板时默认是不进入base环境的 1.输入此命令nano ~/.bashrc看到图1后把conda activate 你的环境名 放到图中标记位置 然后保存退出&#xff1a; Ctrl O 回车保存 Ctrl X 退出编辑器 输入此命令后&#xff0c;source ~/.bas…...

【高中数学/指数/对数】同构六君子之 x/e^x/lnx组合曲线

yx*e^x ye^x/x yx/e^x yx*lnx ylnx/x yx/lnx END...

Golang|在线排查协程泄漏

根据我们的代码&#xff0c;前5毫秒内&#xff0c;每隔1毫秒就会来一个请求&#xff0c;5毫秒之后由于前面的协程执行完&#xff0c;后面又会来新的协程&#xff0c;所以协程数目会保持稳定但是代码一运行&#xff0c;协程数量一直增长&#xff0c;发生了协程泄漏 我们可以list…...

健康养生指南

在快节奏的现代生活中&#xff0c;健康养生愈发重要&#xff0c;它是我们享受美好生活的基石。​ 饮食是养生的关键一环。秉持均衡原则&#xff0c;每日保证谷类、蔬果、优质蛋白等各类食物合理摄入。多吃富含膳食纤维的粗粮&#xff0c;像燕麦、糙米&#xff0c;可促进肠道蠕…...

实验二 两个多位十进制数相加实验

一、实验目的 1&#xff0e;掌握汇编子程序的编写方法。 2&#xff0e;掌握循环程序的设计方法。 二、实验内容 将键盘输入的两个5位十进制数相加&#xff0c;在屏幕上显示相加的结果。 三、实验要求 1&#xff0e;显示格式&#xff1a;被加数加数相加的结…...

多模态大模型MLLM基础训练范式 Pre-train + Instruction FineTuning

多模态大模型Pre-train 为了在图文嵌入空间中更好地对齐视觉和文本信息。为此&#xff0c;使用图像-文本对&#xff08;image-caption style data&#xff09;&#xff0c;表示为 ( X , Y a ) (\mathbf{X}, Y_a) (X,Ya​)&#xff0c;其中&#xff1a; X \mathbf{X} X&#x…...

2025.4.15六年之约day11

六年之约已经断更好几个月了&#xff0c;当初六年之约是当做日记来写的&#xff0c;然后被同事刷到了&#xff0c;被谈及的时候挺尴尬的&#xff0c;毕竟里面记录的是我的所思所想。在互联网下&#xff0c;是不适合发布日记的&#xff0c;但我又爱记录所思所想所做。 不知道距…...

Rust学习之实现命令行小工具minigrep(二)

Rust学习之实现命令行小工具minigrep&#xff08;二&#xff09; Rust学习之实现命令行小工具minigrep&#xff08;一&#xff09; 前言 继续记录一下Rust 语言学习过程&#xff0c;上次写了一个命令行查找字符串的小项目minigrep。学习完了闭包&#xff08;Closures&#x…...

Access Token 和 Refresh Token 的双令牌机制,维持登陆状态

目录 1. 双令牌机制2. 工作流程3. 客户端实现4. 服务器端实现5. 注意事项拓展&#xff1a;Token在客户端安全存储的几种方式 为了实现客户端在 JWT Token 过期后自动更新 Token&#xff0c;通常会采用 Access Token 和 Refresh Token 的双令牌机制。以下是实现自动更新 Token 的…...

前端 -- uni-app 的 splitChunks 分包详解与实战!

全文目录: 开篇语📝 前言📖 目录🌟 什么是 splitChunks?🛠 splitChunks 的核心原理📂 文件拆分的机制⚙️ 配置选项✨ splitChunks 实战案例1️⃣ 项目初始化2️⃣ 编写页面逻辑3️⃣ 配置 splitChunks4️⃣ 查看效果🧩 splitChunks 的高级用法与优化🔍 优化一…...

【教程】检查RDMA网卡状态和测试带宽 | 附测试脚本

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 检查硬件和驱动状态 测试RDMA通信 报错修复 对于交换机的配置&#xff0c;可以看这篇&#xff1a; 【教程】详解配置多台主机通过交换机实现互…...

OSPF的拓展配置

OSPF的拓展配置 1&#xff0c;ospf的手工认证 1&#xff0c;接口认证 r1: display ospf peer brief &#xff08;查看邻居关系&#xff09; int g 0/0/0 ospf authentication-mode md5 1 cipher 123456 display this r2: ospf authentication-mode md5 1 plain 12345…...

http、https、TLS、证书原理理解,对称加密到非对称加密问题,以及对应的大致流程

http 超文本传输协议 存在问题&#xff1a; 安全性、隐私性、数据完整性 易被中间人&#xff08;黑客之类的&#xff09;对数据进行劫持、篡改、隐私泄露 引出了 https &#xff08;source&#xff09; http 在网络模型中的应用层 Application > transport > inter…...

vscode格式化为什么失效?自动保存和格式化(Prettier - Code formatter,vue-format)

vscode自动格式化保存最终配置 博主找了好多的插件&#xff0c;也跟着教程配置了很多&#xff0c;结果还是没有办法格式化&#xff0c;最终发现了一个隐藏的小齿轮&#xff0c;配置完后就生效了 关键步骤 关键配置 一定要点小齿轮&#xff01;&#xff01;&#xff01; 这个小…...

两类中断控制器处理流程_链式和层级

今天呢&#xff0c;我们来用一种新的视角去看中断子系统&#xff0c;然后仿照人家的方法去写一个虚拟的中断子系统&#xff0c;我们先来讲讲链式和层级&#xff1a; 链式中断控制器(chained)&#xff1a; 上图中&#xff0c;左边的"chained intc"就是链式中断控制器…...

软件测试之接口测试用例设计

1.接口测试用例设计简介 我们对系统的需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后用接口测试用例进行接口测试。接口测试用例的设计也需要用到黑盒测试方法&#xff0c;其与功能测试用例设计的方法类似&#xff0c;接口测试用例设计中还需要增加…...

猫咪如厕检测与分类识别系统系列【九】视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【上】

前情提要 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的如…...

MySQL-运维篇

日志主从复制分库分表读写分离 日志 在任何一种数据库当中都会有各种各样的日志&#xff0c;这些日志记录着数据库运行的各个方面 错误日志 这个命令可以查看文件尾部的50行日志&#x1f446; 这个命令是实时输出&#x1f446; 二进制日志 第三个是索引文件&#xff0c;里面…...

mysql关联查询语句

假设存在以下三张表&#xff1a; orders 表&#xff1a;记录订单信息&#xff0c;包含 order_id&#xff08;订单编号&#xff09;、customer_id&#xff08;客户编号&#xff09;、order_date&#xff08;订单日期&#xff09;等字段。customers 表&#xff1a;记录客户信息&…...

Uniapp权限申请优化方案

获取权限前给用户提示&#xff0c;并在用户拒绝后48小时内不再弹窗请求授权。 优化方案分析 您的代码已经实现了基本的权限申请逻辑&#xff0c;但可以进一步优化以满足应用商店的审核要求。 1. 权限申请前的用户提示优化 当前代码中已经包含了权限申请前的提示功能&#x…...

案例驱动的 IT 团队管理:创新与突破之路:第四章 危机应对:从风险预见到创新破局-4.2 人才流失危机-4.2.3梯队建设的“洋葱模型“

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 梯队建设的"洋葱模型"&#xff1a;破解IT团队人才流失危机的创新实践1. 人才流失危机的现实挑战1.1 行业现状与数据警示1.2 传统应对策略的失效 2. 洋葱模型的理论…...

双目视觉中矩阵等参数说明及矫正

以下是标定文件中各个参数的详细解释&#xff1a; 1. 图像尺寸 (imageSize) 参数值: [1280, 1024]含义: 相机的图像分辨率&#xff0c;宽度为1280像素&#xff0c;高度为1024像素。 2. 相机内参矩阵 (leftCameraMatrix / rightCameraMatrix) 结构: yaml data: [fx, 0, cx, 0,…...

烽火ai场控接入deepseek自动回复话术软件

要将烽火AI场控软件与DeepSeek自动回复话术软件进行对接&#xff0c;实现直播间自动互动功能&#xff0c;需通过API接口或脚本工具完成数据互通。以下是具体操作步骤及注意事项&#xff1a; 确认兼容性与准备工作 软件支持检查 确认烽火AI场控是否开放API接口&#xff08;一般需…...

CSS 美化页面(三)

一、盒模型 盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素 。包含&#xff1a; 外边距&#xff0c;边框&#xff0c;填充&#xff0c;和实际内容 一个盒子由四个区域组成&#xff1a;内容&#xff08;Content&#xff09;、内边距&#xff08;Padding&#xff09;、外…...

面试题之数据库-mysql高阶及业务场景设计

最近开始面试了&#xff0c;410面试了一家公司 针对自己薄弱的面试题库&#xff0c;深入了解下&#xff0c;也应付下面试。在这里先祝愿大家在现有公司好好沉淀&#xff0c;定位好自己的目标&#xff0c;在自己的领域上发光发热&#xff0c;在自己想要的领域上&#xff08;技术…...

STM32F407实现SD卡的读写功能

文章目录 前言一、SDIO简介二、SD卡操作1.读操作2.写数据3.擦除操作4.最终效果5.完整工程 前言 在STM32中存储空间是有限的&#xff0c;对于需要存储大量数据的项目就需要外扩存储空间&#xff0c;一般会选择FLASH、EEPROM或者SD卡。SD是这三种中可达空间最大的&#xff0c;所…...

Vue 3中的setup【与Vue 2的区别】

一、前言 在Vue 3中&#xff0c;setup是组合式API&#xff08;Composition API&#xff09;的核心入口函数。其核心作用是为组件提供灵活的逻辑组织方式&#xff0c;解决复杂组件中逻辑碎片化的问题。 二、核心作用 1.初始化响应式数据 通过ref和reactive等API声明响应式状态…...

基于PySide6的YOLOv8/11目标检测GUI界面——智能安全帽检测系统

&#x1f4d6; 前言 在工业安全领域&#xff0c;智能安全帽检测是保障工人生命安全的重要技术手段。本文将介绍如何利用YOLOv8/YOLOv11目标检测算法与PySide6 GUI框架&#xff0c;开发一套功能完整的智能安全帽检测系统。系统支持&#xff1a; 动态切换检测模型&#xff08;Y…...

AF3 generate_chain_data_cache脚本解读

AlphaFold3 generate_chain_data_cache 脚本在源代码的scripts文件夹下。该脚本从指定目录中批量解析 mmCIF/PDB 文件的工具,并将每个链的基本信息(序列、分辨率、是否属于聚类等)提取并写入 JSON 文件,主要用于后续蛋白质建模、过滤或训练数据准备。 源代码: import ar…...

C/C++不透明指针

今天在ESP32编程中又看到了这个词&#xff0c;这个词出现在cursor回答中。回答如下&#xff1a; struct esp_netif_obj; typedef struct esp_netif_obj esp_netif_t;esp_netif_obj的具体实现细节被隐藏了用户代码只能通过esp_netif_t类型指针来操作网络接口这种封装方式被称为…...

电力实习中需要注意哪些安全用电问题

电力实习中需要注意哪些安全用电问题 在电工实习中&#xff0c;由于涉及到电力设备和电气设施&#xff0c;安全问题尤为重要。 以下是电工实习中需要注意的安全问题&#xff1a; 一、电气设备及线路安全 使用电气设备前&#xff0c;应确保设备具有良好的电气绝缘&#xff0c…...