深入探究:JSONCPP库的使用与原理解析
君子不器
🚀JsonCPP开源项目直达链接
文章目录
- 简介
- Json
- 示例
- 小结
- Jsoncpp
- Json::Value
- 序列化
- Json::Writer 类
- Json::FastWriter 类
- Json::StyledWriter 类
- Json::StreamWriter 类
- Json::StreamWriterBuilder 类
- 示例
- 反序列化
- Json::Reader 类
- Json::CharReader 类
- Json::CharReaderBuilder 类
- 示例
- 总结
简介
在当今信息爆炸的时代,数据的传递和交换变得比以往任何时候都更为频繁和重要。JSON作为一种轻量级的数据交换格式,在网络通信、数据存储以及配置文件中被广泛应用。而在C++编程领域,处理JSON数据的需求也日益增长。为了应对这一需求,诞生了JSONCPP库。
JSONCPP,作为一个开源的C++库,旨在为C++开发者提供便捷、高效的JSON数据处理能力。借助JSONCPP,开发者可以轻松解析、生成以及操作JSON数据,从而实现各种应用场景下的需求。
JSONCPP的设计理念是简单易用,旨在降低开发者处理JSON数据的复杂度。它提供了直观的API,使得即使是对JSON数据处理经验有限的开发者也能够快速上手。JSONCPP的核心数据结构是Json::Value类,它灵活地表示了JSON数据的各种类型,包括对象、数组、字符串等。通过Json::Value类及其相关方法,开发者可以直观地操作JSON数据,无需关注复杂的内部实现细节。
JSONCPP不仅提供了简单的接口,还具有高度的灵活性和可扩展性。它支持各种JSON数据结构和语法,能够满足不同场景下的需求。无论是简单的键值对结构还是复杂的嵌套对象,JSONCPP都能够轻松应对。同时,JSONCPP还提供了丰富的文档和示例代码,帮助开发者更好地理解和应用该库。
总的来说,JSONCPP是一个强大而实用的C++库,为处理JSON数据提供了便捷的解决方案。无论是Web开发、移动应用还是嵌入式系统,JSONCPP都是一个不可或缺的利器。在这个充满挑战和机遇的时代,掌握JSONCPP的使用技巧将为开发者带来无尽的可能性。
简而言之,json 是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。🙂
Json
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛应用于网络通信、配置文件、API通信等领域。它的简洁性、易读性以及与多种编程语言的兼容性使得它成为了目前最流行的数据交换格式之一。
- 格式和语法
格式和语法 | 说明 |
---|---|
基本格式 | JSON数据是由键值对(key-value pairs)组成的。键必须是字符串,值可以是字符串、数字、布尔值、数组、对象或null。 |
数据类型 | JSON支持字符串、数字、布尔值、数组、对象和null等基本数据类型。 |
数据结构 | JSON数据可以是嵌套的,可以包含对象和数组,并支持多种组合方式。 |
语法规则 | JSON数据必须符合特定的语法规则,例如键和字符串必须使用双引号包围,值之间使用逗号分隔等。 |
- 基本数据类型
数据类型 | 说明 |
---|---|
字符串(String) | 以双引号包围的Unicode字符序列。 |
数字(Number) | 可以是整数或浮点数形式,不需要使用特定的符号或标记。 |
布尔值(Boolean) | 可以是true或false。 |
数组(Array) | 有序的值的集合,用方括号([])表示。 |
对象(Object) | 无序的键/值对的集合,用花括号({})表示。 |
JSON是一种跨平台的数据格式,能够在不同的操作系统和编程语言中进行解析和生成。并且JSON与JavaScript密切相关,它源于JavaScript的对象字面量语法,并且JavaScript提供了内置的JSON对象,用于解析和序列化JSON数据。
各种编程语言都有相应的JSON库,用于解析和生成JSON数据。JSON解析器用于将JSON格式的文本数据解析成程序内部的数据结构,便于程序进行处理和操作。
Json使用场景:
- 网络通信:在Web开发中,JSON常用于客户端和服务器之间的数据交换。
- 配置文件:JSON格式简洁清晰,适合用于配置文件的存储和读取。
- API通信:许多Web服务和API都使用JSON作为数据交换的格式。
示例
以下是一个简单的JSON示例,演示了不同数据类型的使用和嵌套结构:
{"name": "John Doe","age": 30,"isStudent": false,"address": {"city": "New York","postalCode": "10001"},"languages": ["C++", "JavaScript", "Python"],"friends": [{"name": "Alice","age": 28},{"name": "Bob","age": 32}]
}
在这个JSON示例中,我们有一个名为"John Doe"的人的信息:
- "name"字段是一个字符串,表示姓名。
- "age"字段是一个数字,表示年龄。
- "isStudent"字段是一个布尔值,表示是否是学生。
- "address"字段是一个嵌套的对象,包含城市和邮政编码。
- "languages"字段是一个数组,包含该人擅长的编程语言。
- "friends"字段是一个包含两个对象的数组,表示该人的朋友列表。每个朋友对象包含姓名和年龄。
这个JSON示例展示了JSON的灵活性和适用性,它可以表示各种复杂的数据结构,并且易于阅读和理解。 JSON的简洁性和易读性使其成为了数据交换和存储的首选格式之一。
小结
JSON的简洁性、易读性和与多种编程语言的兼容性使得它成为了数据交换和存储的首选格式之一。无论是在Web开发、移动应用还是嵌入式系统中,JSON都扮演着重要的角色,为数据交换和传输提供了便捷而高效的解决方案。
Jsoncpp
JSONCPP是一个开源的C++库,用于解析和生成JSON数据。它遵循JSON数据格式的规范,并提供了易于理解和操作的API。JSONCPP的核心是Json::Value类,它表示JSON数据的各种类型,包括对象、数组、字符串、数字等。
- 主要特点
特点 | 说明 |
---|---|
简单易用 | JSONCPP提供了简单易用的API,使得在C++程序中处理JSON数据变得容易而直观。 |
跨平台性 | JSONCPP可以在多个操作系统上使用,包括Windows、Linux和macOS等。 |
开源 | JSONCPP是一个开源项目,源代码托管在GitHub上,任何人都可以访问、使用和贡献。 |
灵活性 | JSONCPP支持处理各种复杂的JSON数据结构,包括对象、数组、字符串、数字等。 |
Json::Value
Json::Value是JSONCPP库中最核心的类之一,用于表示JSON数据的各种类型,包括字符串、数字、布尔值、数组、对象和null等。在结合源码后来分析Json::Value类的实现:
- Json::Value的定义
Json::Value的定义包含在 Json::Value.h 头文件中。以下是 Json::Value 类的简化定义:
namespace Json {class Value {public:// 构造函数Value();// 复制构造函数Value(const Value& other);// 析构函数~Value();// 重载赋值运算符Value& operator=(const Value& other);// 重载下标操作符,用于访问对象或数组中的成员Value& operator[](const std::string& key);Value& operator[](const char* key);const Value& operator[](ArrayIndex index) const;// 移除对象中指定键的成员Value removeMember(const char* key);// 添加数组元素Value& append(const Value& value);// 获取数组元素个数ArrayIndex size() const;// 类型转换方法std::string asString() const;const char* asCString() const;int asInt() const;float asFloat() const;bool asBool() const;// 其他方法...};
}
在这个简化的定义中,Json::Value 类包含了构造函数、复制构造函数、析构函数以及赋值运算符的定义。它还重载了下标操作符,使得可以像访问数组或对象一样访问 Json::Value 对象中的成员。除此之外,Json::Value 类还提供了一系列方法来操作和转换 JSON 数据的不同类型。
Json::Value 类的完整定义实现了更多功能,如处理 JSON 数据的解析、序列化、格式化输出等,使得它成为处理 JSON 数据的重要工具之一。
- Json::Value的构造函数
Json::Value 类的构造函数用于创建一个 Json::Value 对象的实例。它有多个重载版本,可以根据不同的参数类型进行构造。
以下是 Json::Value 类的构造函数的简化定义:
namespace Json {class Value {public:// 默认构造函数,创建一个空的 Json::Value 对象Value();// 从布尔值创建 Json::Value 对象explicit Value(bool value);// 从整数创建 Json::Value 对象explicit Value(Int value);// 从 64 位整数创建 Json::Value 对象explicit Value(Int64 value);// 从无符号整数创建 Json::Value 对象explicit Value(UInt value);// 从 64 位无符号整数创建 Json::Value 对象explicit Value(UInt64 value);// 从双精度浮点数创建 Json::Value 对象explicit Value(double value);// 从字符串创建 Json::Value 对象explicit Value(const char* value);explicit Value(const std::string& value);// 从数组创建 Json::Value 对象explicit Value(const StaticString& value);explicit Value(const char* beginValue, const char* endValue);template <typename Iterator> explicit Value(Iterator beginValue, Iterator endValue);// 从对象创建 Json::Value 对象explicit Value(const Object& value);// 从其他 Json::Value 对象创建新的 Json::Value 对象Value(const Value& other);// 析构函数~Value();// 其他方法...};
}
这些构造函数允许以不同的方式初始化 Json::Value 对象,可以从布尔值、整数、浮点数、字符串、数组、对象以及其他 Json::Value 对象中创建新的 Json::Value 对象。Json::Value 类的构造函数为用户提供了灵活的选项,以适应不同的 JSON 数据类型和初始化方式。
Json::Value类是JSONCPP库中最核心的组件之一,通过深入理解和使用Json::Value类,开发者可以更加灵活地处理JSON数据,实现各种功能需求。
序列化
JSON 序列化相关的类:Json::Writer
、Json::FastWriter
、Json::StyledWriter
、Json::StreamWriter
和 Json::StreamWriterBuilder
。
Json::Writer 类
class JSON_API Writer {
public:virtual std::string write(const Value& root) = 0;
};
Json::Writer
是一个抽象基类,用于 JSON 序列化。- 提供了纯虚函数
write
,表示将Json::Value
对象转换为 JSON 格式的字符串。 - 派生类需要实现这个函数来实现具体的序列化功能。
Json::FastWriter 类
class JSON_API FastWriter : public Writer {
public:virtual std::string write(const Value& root) override;// 其他成员和方法
};
Json::FastWriter
是Json::Writer
的派生类,提供了快速的 JSON 序列化功能。- 实现了
write
方法,使用快速的算法将Json::Value
转换为 JSON 字符串。 - 通常用于快速生成 JSON 字符串,但可能会牺牲一些可读性。
Json::StyledWriter 类
class JSON_API StyledWriter : public Writer {
public:virtual std::string write(const Value& root) override;// 其他成员和方法
};
Json::StyledWriter
是Json::Writer
的派生类,提供了格式化输出的 JSON 序列化功能。- 实现了
write
方法,将Json::Value
转换为带缩进和换行的易读的 JSON 字符串。 - 通常用于生成可读性更好的 JSON 字符串,但可能会牺牲一些性能。
Json::StreamWriter 类
class JSON_API StreamWriter {
public:virtual int write(Value const& root, std::ostream* sout) = 0;// 其他成员和方法
};
Json::StreamWriter
是一个抽象基类,用于将Json::Value
对象写入到输出流中。- 提供了纯虚函数
write
,表示将Json::Value
对象写入到给定的输出流中。 - 派生类需要实现这个函数来实现具体的输出功能。
Json::StreamWriterBuilder 类
class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
public:virtual StreamWriter* newStreamWriter() const override;// 其他成员和方法
};
Json::StreamWriterBuilder
是用于构建Json::StreamWriter
对象的构建器类。- 继承自
Json::StreamWriter::Factory
,表示它是一个工厂类,用于创建Json::StreamWriter
对象。 - 提供了虚函数
newStreamWriter
,用于创建一个新的Json::StreamWriter
对象。需要派生类实现该函数。
示例
```cpp
#include <iostream>
#include <memory>
#include <sstream>
#include <jsoncpp/json/json.h>int main()
{//创建一个json对象Json::Value root;root["name"] = "张三";root["age"] = "18";root["score"].append(80);root["score"].append(90);root["score"].append(89);//使用FastWriter进行序列化Json::FastWriter fw;std::cout << "FastWriter : " << fw.write(root) << std::endl;//使用StyleWriter进行序列化Json::StyledWriter sw;std::cout << "StyledWriter : " << sw.write(root) << std::endl;//使用Streamwriter进行序列化Json::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw2(swb.newStreamWriter());std::ostringstream oss;sw2->write(root, &oss);std::cout << "StreamWriter : " << oss.str() << std::endl;return 0;
}
综上所述,这些类提供了不同版本的 JSON 序列化功能,Json::Writer
是基础类,而 Json::FastWriter
和 Json::StyledWriter
是其派生类,分别提供了快速和格式化输出的功能。另外,Json::StreamWriter
类提供了将 JSON 内容写入到输出流的能力,而 Json::StreamWriterBuilder
则用于构建对应的输出流对象。
反序列化
JSON 反序列化相关的三个类:Json::Reader
、Json::CharReader
和 Json::CharReaderBuilder
。
Json::Reader 类
class JSON_API Reader {
public:bool parse(const std::string& document, Value& root, bool collectComments = true);// 其他成员和方法
};
Json::Reader
类是用于 JSON 反序列化的低版本类。- 提供了
parse
方法,用于从字符串中解析 JSON 文档,并将解析结果存储到传入的Json::Value
对象中。 - 第三个参数
collectComments
控制是否收集注释,默认为true
,表示收集注释。
Json::CharReader 类
class JSON_API CharReader {
public:virtual bool parse(char const* beginDoc, char const* endDoc,Value* root, std::string* errs) = 0;// 其他成员和方法
};
Json::CharReader
类是一个抽象基类,用于 JSON 反序列化的高版本类。- 提供了纯虚函数
parse
,表示解析 JSON 文档的接口。需要派生类实现该函数。 - 接受字符指针
beginDoc
和endDoc
,表示 JSON 文档的起始和结束位置。 - 将解析结果存储到传入的
Json::Value
对象中,同时可通过传入的std::string
对象记录错误信息。
Json::CharReaderBuilder 类
class JSON_API CharReaderBuilder : public CharReader::Factory {
public:virtual CharReader* newCharReader() const;// 其他成员和方法
};
Json::CharReaderBuilder
类是用于构建Json::CharReader
对象的构建器类。- 继承自
Json::CharReader::Factory
,表示它是一个工厂类,用于创建Json::CharReader
对象。 - 提供了虚函数
newCharReader
,用于创建一个新的Json::CharReader
对象。需要派生类实现该函数。
示例
#include <iostream>
#include <memory>
#include <jsoncpp/json/json.h>void print(Json::Value& root)
{std::cout << "name : " << root["name"].asString() << "\nage : " << root["age"].asInt() << "\nscore : ";for(unsigned i = 0; i < root["score"].size(); i++){std::cout << root["score"][i].asFloat() << ' ';}std::cout << std::endl;
}int main()
{std::string jsonStr = "{\"name\": \"张三\", \"age\": 18, \"score\": [80, 90, 89]}";{//定义value对象存放数据Json::Value root;//定义reader对象Json::Reader read;read.parse(jsonStr, root);print(root);}{Json::Value root;//定义charreader对象Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;cr->parse(jsonStr.c_str(), jsonStr.c_str() + jsonStr.size(), &root, &err);print(root);std::cout << "err : " << err << std::endl;}return 0;
}
综上所述,这三个类分别是低版本和高版本的 JSON 反序列化类,提供了不同版本的接口来满足不同的需求。Json::Reader
是低版本的简单实现,而 Json::CharReader
是高版本的抽象接口,通过 Json::CharReaderBuilder
可以创建对应的实例。
总结
文章深入介绍了jsoncpp库的使用,在使用jsoncpp时,可以利用其提供的Json::Reader
和Json::CharReader
类来解析JSON数据。通过这些类,可以将JSON字符串或字符数组解析为Json::Value
对象,从而方便地访问和操作JSON中的数据。
除了解析功能,jsoncpp还提供了Json::Writer
和Json::StreamWriter
等类来将JSON数据序列化为字符串或输出到流中。这些类可以帮助用户将内存中的JSON数据转换为字符串形式,或者直接输出到文件或网络流中。
总的来说,jsoncpp是一个功能丰富且易于使用的JSON处理库,为C++开发者提供了便捷的JSON数据处理方案,使得在C++项目中处理JSON数据变得更加简单高效。
相关文章:
深入探究:JSONCPP库的使用与原理解析
君子不器 🚀JsonCPP开源项目直达链接 文章目录 简介Json示例小结 JsoncppJson::Value序列化Json::Writer 类Json::FastWriter 类Json::StyledWriter 类Json::StreamWriter 类Json::StreamWriterBuilder 类示例 反序列化Json::Reader 类Json::CharReader 类Json::Ch…...
字节UC伯克利新研究 | Magic-Me:简单有效的主题ID可控视频生成框架
在生成模型领域,针对特定身份(ID)创建内容已经引起了极大的兴趣。在文本到图像生成(T2I)领域,以主题驱动的内容生成已经取得了巨大的进展,使图像中的ID可控。然而,将其扩展到视频生成…...
2024免费人像摄影后期处理工具Portraiture4.1
Portraiture作为一款智能磨皮插件,确实为Photoshop和Lightroom用户带来了极大的便利。通过其先进的人工智能算法,它能够自动识别并处理照片中的人物皮肤、头发和眉毛等部位,实现一键式的磨皮美化效果,极大地简化了后期处理的过程。…...
Spring Boot 笔记 010 创建接口_更新用户头像
1.1.1 usercontroller中添加updateAvatar,校验是否为url PatchMapping("updateAvatar")public Result updateAvatar(RequestParam URL String avatarUrl) {userService.updateAvatar(avatarUrl);return Result.success();} 1.1.2 userservice //更新头像…...
认识并使用HttpLoggingInterceptor
目录 一、前情回顾二、HttpLoggingInterceptor1、HttpLoggingInterceptor拦截器是做什么的?2、如何使用HttpLoggingInterceptor?2.1 日志级别2.2 如何看日志?2.2.1 日志级别:BODY2.2.2 日志级别:BASIC2.2.3 日志级别&a…...
内存块与内存池
(1)在运行过程中,MemoryPool内存池可能会有多个用来满足内存申请请求的内存块,这些内存块是从进程堆中开辟的一个较大的连续内存区域,它由一个MemoryBlock结构体和多个可供分配的内存单元组成,所有内存块组…...
【FPGA开发】HDMI通信协议解析及FPGA实现
本篇文章包含的内容 一、HDMI简介1.1 HDMI引脚解析1.2 HDMI工作原理1.3 DVI编码1.4 TMDS编码 二、并串转换、单端差分转换原语2.1 原语简介2.2 原语:IO端口组件2.3 IOB 输入输出缓冲区2.4 并转串原语OSERDESE22.4.1 OSERDESE2 工作原理2.4.2 OSERDESE2 级联示意图2.…...
[NSSRound#16 Basic]Web
1.RCE但是没有完全RCE 显示md5强比较,然后md5_3随便传 md5_1M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&md5_2M%C9h%FF%0E%E3%5C%20%95r%D4w…...
[职场] 会计学专业学什么 #其他#知识分享#职场发展
会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科,本专业培养具备财务、管理、经济、法律等方面的知识和能力,具有分析和解决财务、金融问题的基本能力,能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…...
docker (五)-docker存储-数据持久化
将数据存储在容器中,一旦容器被删除,数据也会被删除。同时也会使容器变得越来越大,不方便恢复和迁移。 将数据存储到容器之外,这样删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂…...
飞行路线(分层图+dijstra+堆优化)(加上题目选数复习)
飞行路线 这一题除了堆优化和dijstra算法和链式前向星除外还多考了一个考点就是,分层图,啥叫分层图呢?简而言之就是一个三维的图,按照其题意来说有几个可以免费的点就有几层,而且这个分层的权值为0(这样就相…...
云计算基础-快照与克隆
快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录,也就是把虚拟机当前的状态保存下来(快照不是备份,快照保存的是状态,备份保存的是副本) 快照优点 速度快,占用空间小 快照工作原理 在了解快照原理前,…...
使用 RAG 创建 LLM 应用程序
如果您考虑为您的文件或网站制作一个能够回应您的个性化机器人,那么您来对地方了。我可以帮助您使用Langchain和RAG策略来创建这样一个机器人。 了解ChatGPT的局限性和LLMs ChatGPT和其他大型语言模型(LLMs)经过广泛训练,以理解…...
第13章 网络 Page744~746 asio核心类 ip::tcp::endPoint
2. ip::tcp::endpoint ip::tcp::socket用于连接TCP服务端的 async_connect()方法的第一个入参是const endpoint_type& peer_endpoint. 此处的类型 endpoint_type 是 ip::tcp::endpoint 在 在 ip::tcp::socket 类内部的一个别名。 libucurl 库采用字符串URL表达目标的地…...
面试浏览器框架八股文十问十答第一期
面试浏览器框架八股文十问十答第一期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)什么是 XSS 攻击&#…...
多线程的基本原理学习
由一个问题引发的思考 线程的合理使用能够提升程序的处理性能,主要有两个方面,第一个是能够利用多核cpu以及超线程技术来实现线程的并行执行;第二个是线程的异步化执行相比于同步执行来说,异步执行能够很好的优化程序的处理性能提…...
C/C++进制转换
十进制转化为二进制 进制转化#include <iostream> using namespace std;void change(int); int main() {int num;cout << "请输入一个十进制数: ";cin >> num;cout << "转化后的二进制数为: ";change(num);return 0; } void chan…...
使用 Coze 搭建 TiDB 助手
导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台,突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理,包括知识库、function call、embedding 模型等关键概念,最后成功演示了如何在 Coze…...
Arduino程序简单入门
文章目录 一、结构1.1 setup()1.2 loop() 二、结构控制2.1 if2.2 if...else2.3 switch case2.4 for2.5 while2.6 do...while2.7 break2.8 continue2.9 return2.10 goto 三、扩展语法3.1 ;(分号)3.2 {}(花括号)3.3 //(单…...
QT+OSG/osgEarth编译之八十三:osgdb_ogr+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ogr)
文章目录 一、osgdb_ogr介绍二、文件分析三、pro文件四、编译实践一、osgdb_ogr介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_ogr是osgDB模块中的一个插件,它提供了对OGR(开放地理空间联盟)库的支持。 OGR是一个开源的地理空间数据…...
开年炸裂-Sora/Gemini
最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token,可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment:google公司有夸大的传统,所以真实效果需要上…...
vue前端系统启动报错Module not found: Error: Can‘t resolve ‘sass-loader‘
1、确认项目中是否已安装 node-sass 包。sass-loader 是依赖于 node-sass 包的,如果没有安装 node-sass 包,也会导致无法找到 sass-loader 包。 npm ls node-sass安装 node-sass 包: npm install --save-dev node-sass2、确认项目中是否已安…...
HTML | DOM | 网页前端 | 常见HTML标签总结
文章目录 1.前端开发简单分类2.前端开发环境配置3.HTML的简单介绍4.常用的HTML标签介绍 1.前端开发简单分类 前端开发,这里是一个广义的概念,不单指网页开发,它的常见分类 网页开发:前端开发的主要领域,使用HTML、CS…...
乡政府|乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)
乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…...
存储系统如何规避数据静默错误SDC?
存储系统规避数据静默错误(Silent Data Corruption, SDC)是一项复杂且关键的任务,涉及多个层次的技术和策略。数据静默错误是指在存储或传输过程中发生的错误,这些错误未被检测出来,因此无法立即纠正,可能导…...
《Linux 简易速速上手小册》第8章: 安全性与加固(2024 最新版)
文章目录 8.1 防火墙与安全策略8.1.1 重点基础知识8.1.2 重点案例:配置 iptables 以保护 Web 服务器8.1.3 拓展案例 1:使用 firewalld 配置动态防御区域8.1.4 拓展案例 2:配置 ufw 以简化管理 8.2 SSH 安全最佳实践8.2.1 重点基础知识8.2.2 重…...
Ubuntu Desktop 显示文件路径
Ubuntu Desktop 显示文件路径 1. GUI hot key2. CLIReferences 1. GUI hot key Ctrl L: 显示文件路径 2. CLI right click -> Open in Terminal -> pwd strongforeverstrong:~/Desktop$ pwd /home/strong/DesktopReferences [1] Yongqiang Cheng, https://yongqiang…...
【Java程序设计】【C00270】基于Springboot的moba类游戏攻略分享平台(有论文)
基于Springboot的moba类游戏攻略分享平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏攻略分享平台 本系统分为系统功能模块、管理员功能模块、以及用户后台功能模块。 系统功能模块:在平台首…...
【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV+最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能)
【旧文更新】【优秀毕设】人脸识别打卡/签到/考勤管理系统(OpenCV最简基本库开发、可移植树莓派 扩展网络图像推流控制 验证码及Excel邮件发送等功能) 文章目录 关于旧文新发毕设结构主页面验证码识别效果管理页面人脸信息采集管理实时数据更新签到结果…...
模型 4i(趣味、利益、互动、个性)理论
系列文章 分享 模型,了解更多👉 模型_总纲目录。重在提升认知。以用户为中心营销。 1 模型 4i(趣味、利益、互动、个性)理论的应用 1.1 4i理论在电子商务中的应用 小米公司在其电子商务平台上运用了 4i理论,取得了较好的效果。具体表现如下…...
解线性方程组(二)——Jacobi迭代法求解(C++)
迭代法 相比于直接法求解,迭代法使用多次迭代来逐渐逼近解,其精度比不上直接法,但是其速度会比直接法快很多,计算精度可控,特别适用于求解系数矩阵为大型稀疏矩阵的方程组。 Jacobi迭代法 假设有方程组如下…...
信息安全技术基础知识
一、考点分布 信息安全基础(※※)信息加密解密技术(※※※)密钥管理技术(※※)访问控制及数字签名技术(※※※)信息安全的保障体系 二、信息安全基础 信息安全包括5个基本要素&#…...
使用Taro开发鸿蒙原生应用——快速上手,鸿蒙应用开发指南
导读 本指南为开发者提供了使用 Taro 框架开发鸿蒙原生应用的快速入门方法。Taro,作为一个多端统一开发框架,让开发者能够使用一套代码同时适配多个平台,包括鸿蒙系统。文章将详细介绍如何配置开发环境,以及如何利用 Taro 的特性…...
C语言指针(初阶)
文章目录 1:内存与地址1.1内存1.2:如何理解编址 2:指针变量与地址2.1:指针变量与解引用操作符2.1.1:指针变量2.1.2:如何拆解指针类型2.1.3:解引用操作符 2.2:指针变量的大小 3:指针变量类型的意义代码1解引用修改前解引用修改后 代码2解引用修改前解引用修改后 4:const修饰指针…...
Python循环语句——for循环的嵌套使用
一、引言 在Python编程中,循环是控制程序流程的重要工具,它允许我们重复执行某段代码,直到满足特定的条件为止。其中,for循环是Python中最常用的循环类型之一。而嵌套循环,即在一个循环内部再嵌套另一个循环ÿ…...
Java创建线程真的有三种方式吗?
(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:传送门 🍹 本人24应届生一枚,技术和水平有限&am…...
17-k8s控制器资源-job控制
job控制器:就是一次性任务的pod控制器,pod完成作业后不会重启,其重启策略是:Never 1,job控制器案例描述 启动一个pod,执行完成一个事件,然后pod关闭; 事件:计算π的值&a…...
lazarus:LCL 嵌入 fpwebview 组件,做一个简单浏览器
从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\lclembed 修改 lclembed.lpr 如下,将 fphttpapp. 注释掉,因为我用不上 a simple…...
c++类和对象新手保姆级上手教学(上)
前言: c其实顾名思义就是c语言的升级版,很多刚学c的同学第一感觉就是比c语言难学很多,其实没错,c里的知识更加难以理解可以说杂且抽象,光是类和对象,看起来容易,但想完全吃透,真的挺…...
可变参数(c/c++)
目录 一、C语言版本 二、C的实现方法 2.1数据包 2.2sizeof...运算符 2.3可变参数模板的使用 2.4emplace_back() 有时候我们在编写函数时,可能不知道要传入的参数个数,类型 。比如我们要实现一个叠加函数,再比如c语言中的printf,c中的emp…...
【数据结构】图
文章目录 图1.图的两种存储结构2.图的两种遍历方式3.最小生成树的两种算法(无向连通图一定有最小生成树)4.单源最短路径的两种算法5.多源最短路径 图 1.图的两种存储结构 1. 图这种数据结构相信大家都不陌生,实际上图就是另一种多叉树&…...
32.3K Star,再见 Postman,这款开源 API 客户端更香
Hi,骚年,我是大 G,公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目,一分钟 get 一个优秀的开源项目,挖掘开源的价值,欢迎关注。 使用 API 工具来调试接口是后端开发经常会使用的,之前一直…...
Python循环语句——continue和break
一、引言 在Python编程中,循环是常见的控制流语句,它允许我们重复执行一段代码,直到满足某个条件为止。而在循环中,continue和break是两个非常重要的控制语句,它们可以帮助我们更加灵活地控制循环的行为。 二、contin…...
C++面向对象程序设计-北京大学-郭炜【课程笔记(三)】
C面向对象程序设计-北京大学-郭炜【课程笔记(三)】 1、构造函数(constructor)1.1、基本概念 2、赋值构造函数2.1、基本概念2.1、复制构造函数起作用的三种情况2.2、常引用参数的使用 3、类型转换构造函数3.1、什么事类型转换构造函…...
Linux:搭建docker私有仓库(registry)
当我们内部需要存储镜像时候,官方提供了registry搭建好直接用,废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…...
用HTML、CSS和JS打造绚丽的雪花飘落效果
目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetGBK"><style>* {margin: 0;padding: 0;}#box {width: 100vw;heig…...
订餐|网上订餐系统|基于springboot的网上订餐系统设计与实现(源码+数据库+文档)
网上订餐系统目录 目录 基于springboot的网上订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能模块的实现 (1)用户注册界面 (2)用户登录界面 (3)菜品详情界面 (…...
从零开始学howtoheap:解题西湖论剑Storm_note
how2heap是由shellphish团队制作的堆利用教程,介绍了多种堆利用技术,后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境:从零开始配置pwn环境:从零开始配置pwn环境:优化pwn虚拟机配置支持libc等指…...
Rust 基本环境安装
rust 基本介绍请看上一篇文章:rust 介绍 rustup 介绍 rustup 是 Rust 语言的安装器和版本管理工具。通过 rustup,可以轻松地安装 Rust 编译器(rustc)、标准库和文档。它也允许你切换不同的 Rust 版本或目标平台,以及…...
【电源】POE系统供电原理(二)
转载本博客文章,请注明出处 上一篇文章中,有提到POE系统工作原理及动态检测机制,下面我们继续介绍受电端PD技术及原理。POE供电系统包含PSE、PD及互联接口部分组成,如下图所示。 图1 POE供电系统 PSE控制器的主要作用ÿ…...