QJson的写入和解析基本操作

一、QJson简介

QJson 是一个用于处理 JSON(JavaScript Object Notation)数据的 C++ 库

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式
JSON 的语法简洁明了,使用人类可读的文本格式来表示数据
它由键值对组成,键是字符串值可以是字符串、数字、布尔值、对象、数组或 null

二、QJson常见类型

QJson 常见类型主要有以下两种:
Ⅰ、QJsonArray 类型
QJsonArray 代表 JSON 中的数组类型。它是一个可动态增长的容器,可以存储一系列的 QJsonValue 对象。
例如,可以用来表示一个包含多个字符串、数字、布尔值、对象或其他数组的列表。
有序性:元素在数组中有明确的顺序。
可遍历性:可以通过迭代器或者索引来访问和操作其中的元素
在这里插入图片描述

Ⅱ、QJsonObject 类型
QJsonObject 代表 JSON 中的对象类型。它由一系列的键值对组成,其中键是字符串类型,值可以是 QJsonValue 的任何一种类型,包括字符串、数字、布尔值、对象、数组或 null。
例如,可以用来表示一个包含多个属性及其对应值的对象。
键值对结构:通过唯一的键来访问对应的值。
灵活性:可以方便地添加、删除和修改键值对。
QJsonObject 存储的时候是无序
在这里插入图片描述

我习惯将QJsonArray 说成数组类型,QJsonObject 说出对象类型
判断一个Json文件是什么类型,主要看文件的开头第一个符号,若是以中括号开头的就是数组,若以大括号开头的就是对象

Ⅲ、QJsonValue
在 Qt 中,QJsonValue是用于表示 JSON(JavaScript Object Notation)数据中的值的类
QJsonValue可以存储多种不同类型的值,包括布尔值(bool)、整数(int和qint64等)、浮点数(double)、字符串(QString)、对象(QJsonObject)和数组(QJsonArray)
QJsonValue提供了方法来判断存储的值的类型,并进行相应的类型转换。例如,可以使用isBool、isDouble、isString等方法来判断值的类型,然后使用toBool、toDouble、toString等方法进行类型转换

三、写入QJson

1,纯QJsonArray类型

①通过QFile对象file以读写方式打开一个json文件
②定义QJsonArray对象j_arr
③通过append方法添加值,这些值可以是字符串、数字、布尔值、对象或其他数组的列表等
④定义QJsonDocument 对象j_doc
⑤通过setArray方法,将数组对象j_arr加入到文档对象j_doc
⑥调用文件对象file的write方法把文档对象j_doc写入到打开的json文件中,前提需要调用文档对象j_doctoJson方法转为标准Json格式
⑦关闭文件对象file

#include <QString>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>void writeJsonOnlyArray(QString filepath) 
{QFile file(filepath);if (!file.open(QIODevice::ReadWrite)){qDebug() << "File open error";}else{qDebug() << "File open success";}QJsonArray j_arr;j_arr.append("name");j_arr.append(18);j_arr.append(QDateTime::currentDateTime().toString());j_arr.append(true);j_arr.append(12.356);QJsonDocument j_doc;j_doc.setArray(j_arr);file.write(j_doc.toJson());file.close();qDebug() << "write success";
}int main(int argc, char* argv[])
{QString filepath = R"(E:\writeJsonOnlyArray.json)";writeJsonOnlyArray(filepath);return 0;
}

运行效果:
在这里插入图片描述

2,纯QJsonObject类型

①通过QFile对象file以读写方式打开一个json文件
②定义QJsonObject对象j_obj
③通过insert方法添加值,这些值可以是字符串、数字、布尔值、对象或其他数组的列表等
④定义QJsonDocument 对象j_doc
⑤通过setObject方法,将对象j_obj加入到文档对象j_doc
⑥调用文件对象file的write方法把文档对象j_doc写入到打开的json文件中,前提需要调用文档对象j_doctoJson方法转为标准Json格式
⑦关闭文件对象file

#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>void writeJsonOnlyObject(QString filepath) 
{QFile file(filepath);if (!file.open(QIODevice::ReadWrite)){qDebug() << "File open error";}else{qDebug() << "File open success";}QJsonObject j_obj;j_obj.insert("name", "tom");j_obj.insert("age", 18);j_obj.insert("sex", "male");j_obj.insert("time", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));QJsonDocument j_doc;j_doc.setObject(j_obj);file.write(j_doc.toJson());file.close();qDebug() << "write success";
}int main(int argc, char* argv[])
{QString filepath = R"(E:\writeJsonOnlyObject.json)";writeJsonOnlyObject(filepath);return 0;
}

运行效果:
在这里插入图片描述

3,数组中嵌套对象

①通过QFile对象file以读写方式打开一个json文件
②定义QJsonArray对象j_arr
③通过append方法添加值,这些值可以是字符串、数字、布尔值、对象或其他数组的列表等
④定义QJsonObject对象j_obj
⑤通过insert方法添加值,这些值可以是字符串、数字、布尔值、对象或其他数组的列表等
⑥通过append方法将对象j_obj添加进数组j_arr
⑦定义QJsonDocument 对象j_doc
⑧通过setArray方法,将数组对象j_arr加入到文档对象j_doc
⑨调用文件对象file的write方法把文档对象j_doc写入到打开的json文件中,前提需要调用文档对象j_doctoJson方法转为标准Json格式
⑩关闭文件对象file

#include <QString>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>
void w
riterJsonArraryIncludeObject(QString filepath)
{QFile file(filepath);if (!file.open(QIODevice::ReadWrite)){qDebug() << "File open error";}else{qDebug() << "File open success";}QJsonArray j_arr;//Arrayj_arr.append("name");j_arr.append(18);j_arr.append(QDateTime::currentDateTime().toString());j_arr.append(true);j_arr.append(12.356);QJsonObject j_obj;//Obejctj_obj.insert("name", "tom");j_obj.insert("age", 18);j_arr.append(j_obj);//在数组Array中追加Object对象QJsonDocument j_doc;j_doc.setArray(j_arr);//这里把Array数组放进入QJsonDocument中file.write(j_doc.toJson());file.close();qDebug() << "write success";}int main(int argc, char* argv[])
{QString filepath = R"(E:\writerJsonArraryIncludeObject.json)";writerJsonArraryIncludeObject(filepath);return 0;
}

运行效果:
在这里插入图片描述

4,对象中嵌套数组

①通过QFile对象file以读写方式打开一个json文件
②定义QJsonObject对象j_obj
③通过insert方法添加值,这些值可以是字符串、数字、布尔值、对象或其他数组的列表等
④定义QJsonArray对象j_arr
⑤通过append方法添加值,这些值可以是字符串、数字、布尔值、对象或其他数组的列表等
⑥通过insert方法将数组j_arr添加到对象j_obj中,需要给一个key值,其对应的value就是j_arr的内容
⑦定义QJsonDocument 对象j_doc
⑧通过setObject方法,将对象j_obj加入到文档对象j_doc
⑨调用文件对象file的write方法把文档对象j_doc写入到打开的json文件中,前提需要调用文档对象j_doctoJson方法转为标准Json格式
⑩关闭文件对象file

#include <QString>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>void writerJsonObjectIncludeArrary(QString filepath) 
{QFile file(filepath);if (!file.open(QIODevice::ReadWrite)){qDebug() << "File open error";}else{qDebug() << "File open success";}QJsonObject j_obj;j_obj.insert("name", "tom");j_obj.insert("age", 18);QJsonArray j_arr;j_arr.append("name");j_arr.append(18);j_arr.append(QDateTime::currentDateTime().toString());j_arr.append(true);j_arr.append(12.356);j_obj.insert("my_array",j_arr);//需要给这个j_arr数组一个key,这里给定的是"my_array"QJsonDocument j_doc;j_doc.setObject(j_obj);file.write(j_doc.toJson());file.close();qDebug() << "write success";
}int main(int argc, char* argv[])
{QString filepath = R"(E:\writerJsonObjectIncludeArrary.json)";writerJsonObjectIncludeArrary(filepath);return 0;
}

运行效果:
在这里插入图片描述

四、解析QJson

解析QJson,一般情况下前提我们已经很明确这个Json中都有些什么,然后在进行解析

1,纯QJsonArray类型

①判断文件是否存在file.exists(),是否以只读模式打开file.open(QIODevice::ReadOnly)
②定义QTextStream对象stream,读取所有内容到QString对象json_str中,读完之后file.close()关闭file对象,之后直接对QString对象json_str操作即可
QJsonParseError对象jerr读取json_str进行解析,QJsonParseError::NoError返回解析成功与否标志
④判断该Json对象是否是jdoc.isArray()数组,拿到数组的大小jdoc.array().size()开始遍历,QJsonValue对象jval存放单个数组的值
⑤依次判断数组的值的类型jval.type() == QJsonValue::String是否是字符串,若是字符串则QString temp = jval.toString()接收并存放

#include <QString>
#include <QJsonArray>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>void readJsonOnlyArray(QString filepath) 
{QFile file(filepath);if (!file.exists())//文件不存在{qDebug() << "File not exists";}else//文件存在{if (!file.open(QIODevice::ReadOnly))//只读方式打开失败{qDebug() << "File open error";}else {//通过QTextStream读取文件,将读取到的文件存到定义的QString json_str中,之后解析json_str中即可QTextStream stream(&file);stream.setCodec("UTF-8");const QString json_str = stream.readAll();file.close();QJsonParseError jerr;const QJsonDocument jdoc = QJsonDocument::fromJson(json_str.toUtf8(), &jerr);if (jerr.error != QJsonParseError::NoError)//解析失败,不是Json格式{qDebug() << "json parse error" << jerr.errorString();}else//是Json格式{if (jdoc.isArray())//数组{qDebug() << "json is array";for (int i = 0; i < jdoc.array().size(); i++){QJsonValue jval = jdoc.array().at(i);//接受单个数组内容if (jval.type() == QJsonValue::String)//字符串{QString temp = jval.toString();qDebug() << temp;}else if (jval.type() == QJsonValue::Double)//浮点数{double temp = jval.toDouble();qDebug() << temp;}//int、boo等数据类型的判断都类似else if (jval.type() == QJsonValue::Bool)//bool类型{bool temp = jval.toBool();qDebug() << temp;}}}}}}
}int main(int argc, char* argv[])
{QString filepath = R"(E:\writeJsonOnlyArray.json)";readJsonOnlyArray(filepath);return 0;
}

Json文件:writeJsonOnlyArray.json
在这里插入图片描述
运行效果:
在这里插入图片描述

2,纯QJsonObject类型

①判断文件是否存在file.exists(),是否以只读模式打开file.open(QIODevice::ReadOnly)
②定义QTextStream对象stream,读取所有内容到QString对象json_str中,读完之后file.close()关闭file对象,之后直接对QString对象json_str操作即可
QJsonParseError对象jerr读取json_str进行解析,QJsonParseError::NoError返回解析成功与否标志
④判断该Json对象是否是jdoc.isObject()对象,QJsonObject jobj = jdoc.object();将jdoc转换为QJsonObject对象jobj,根据key拿到对应的value,jobj.contains("age")拿到key为age,jobj.value("age").toInt();将key对应的value转换接收

#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>void readJsonOnlyObject(QString filepath)
{QFile file(filepath);if (!file.exists())//文件不存在{qDebug() << "File not exists";}else//文件存在{if (!file.open(QIODevice::ReadOnly))//只读方式打开失败{qDebug() << "File open error";}else{//通过QTextStream读取文件,将读取到的文件存到定义的QString json_str中,之后解析json_str中即可QTextStream stream(&file);stream.setCodec("UTF-8");const QString json_str = stream.readAll();file.close();QJsonParseError jerr;const QJsonDocument jdoc = QJsonDocument::fromJson(json_str.toUtf8(), &jerr);if (jerr.error != QJsonParseError::NoError)//解析失败,不是Json格式{qDebug() << "json parse error" << jerr.errorString();}else//是Json格式{if (jdoc.isObject())//对象{qDebug() << "json is object";QJsonObject jobj = jdoc.object();if (jobj.contains("age")){qDebug() << "age is: " << jobj.value("age").toInt();}if (jobj.contains("name")){qDebug() << "name is: " << jobj.value("name").toString();}if (jobj.contains("sex")){qDebug() << "sex is: " << jobj.value("sex").toString();}if (jobj.contains("time")){qDebug() << "time is: " << jobj.value("time").toString();}}}}}
}
int main(int argc, char* argv[])
{QString filepath = R"(E:\writeJsonOnlyObject.json)";readJsonOnlyObject(filepath);return 0;
}

Json文件:writeJsonOnlyObject.json
在这里插入图片描述
运行效果:
在这里插入图片描述

3,数组中嵌套对象

①判断文件是否存在file.exists(),是否以只读模式打开file.open(QIODevice::ReadOnly)
②定义QTextStream对象stream,读取所有内容到QString对象json_str中,读完之后file.close()关闭file对象,之后直接对QString对象json_str操作即可
QJsonParseError对象jerr读取json_str进行解析,QJsonParseError::NoError返回解析成功与否标志
④判断该Json对象是否是jdoc.isArray()数组,拿到数组的大小jdoc.array().size()开始遍历,QJsonValue对象jval存放单个数组的值
⑤依次判断数组的值的类型jval.type() == QJsonValue::String是否是字符串,若是字符串则QString temp = jval.toString()接收并存放
⑥若为对象时jval.type() == QJsonValue::Object,需要将该QJsonValue对象jval转换QJsonObject对象jobjQJsonObject jobj = jval.toObject()
⑦判断QJsonObject对象jobj是否包含key为age,jobj.contains("age")
⑧若key为age则取出对应的value,jobj.value("age").toInt()

#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>
#include <QJsonArray>void readJsonArraryIncludeObject(QString filepath)
{QFile file(filepath);if (!file.exists())//文件不存在{qDebug() << "File not exists";}else//文件存在{if (!file.open(QIODevice::ReadOnly))//只读方式打开失败{qDebug() << "File open error";}else{//通过QTextStream读取文件,将读取到的文件存到定义的QString json_str中,之后解析json_str中即可QTextStream stream(&file);stream.setCodec("UTF-8");const QString json_str = stream.readAll();file.close();QJsonParseError jerr;const QJsonDocument jdoc = QJsonDocument::fromJson(json_str.toUtf8(), &jerr);if (jerr.error != QJsonParseError::NoError)//解析失败,不是Json格式{qDebug() << "json parse error" << jerr.errorString();}else//是Json格式{if (jdoc.isArray())//数组{qDebug() << "json is array";for (int i = 0; i < jdoc.array().size(); i++)//看看该数组的大小{QJsonValue jval = jdoc.array().at(i);//jval负责接收单个数组的内容if (jval.type() == QJsonValue::String)//字符串{QString str = jval.toString();//将该QJsonValue转换为QStringqDebug() << str;}else if (jval.type() == QJsonValue::Double)//浮点数{double d = jval.toDouble();将该QJsonValue转换为doubleqDebug() << d;}else if (jval.type() == QJsonValue::Bool)//浮点数{bool b = jval.toBool();将该QJsonValue转换为doubleqDebug() << b;}else if (jval.type() == QJsonValue::Object)//对象{QJsonObject jobj = jval.toObject();//将该QJsonValue转换QJsonObjectif (jobj.contains("age"))//对象的key为"age"{qDebug() << "age is: " << jobj.value("age").toInt();//输出key为"age"所对应的value,知道是int型故转为int输出即可}if (jobj.contains("name")){qDebug() << "name is: " << jobj.value("name").toString();}}}}}}}
}
int main(int argc, char* argv[])
{QString filepath = R"(E:\writerJsonArraryIncludeObject.json)";readJsonArraryIncludeObject(filepath);return 0;
}

Json文件:writerJsonArraryIncludeObject.json
在这里插入图片描述
运行效果:
在这里插入图片描述

4,对象中嵌套数组

①判断文件是否存在file.exists(),是否以只读模式打开file.open(QIODevice::ReadOnly)
②定义QTextStream对象stream,读取所有内容到QString对象json_str中,读完之后file.close()关闭file对象,之后直接对QString对象json_str操作即可
QJsonParseError对象jerr读取json_str进行解析,QJsonParseError::NoError返回解析成功与否标志
④判断该Json对象是否是jdoc.isObject()对象,QJsonObject jobj = jdoc.object();将jdoc转换为QJsonObject对象jobj,根据key拿到对应的value,jobj.contains("age")拿到key为age,jobj.value("age").toInt();将key对应的value转换接收
⑤若key为数组且其对应的key为自己设定的数组标志,jobj.contains("my_array")&&jobj["my_array"].isArray(),则将该key对应的value转换为QJsonArray 数组,QJsonArray myArray = jobj["my_array"].toArray();
⑥通过循环进行遍历该数组const QJsonValue& value : myArray,若value.isDouble()为浮点数,则将该QJsonValue对象value转换为浮点数并接收即可double number = value.toDouble();

#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
#include <QDateTime>
#include <QDebug>
#include <iostream>
#include <QJsonArray>void readJsonObjectIncludeArrary(QString filepath)
{QFile file(filepath);if (!file.exists())//文件不存在{qDebug() << "File not exists";}else//文件存在{if (!file.open(QIODevice::ReadOnly))//只读方式打开失败{qDebug() << "File open error";}else{//通过QTextStream读取文件,将读取到的文件存到定义的QString json_str中,之后解析json_str中即可QTextStream stream(&file);stream.setCodec("UTF-8");const QString json_str = stream.readAll();file.close();QJsonParseError jerr;const QJsonDocument jdoc = QJsonDocument::fromJson(json_str.toUtf8(), &jerr);if (jerr.error != QJsonParseError::NoError)//解析失败,不是Json格式{qDebug() << "json parse error" << jerr.errorString();}else//是Json格式{if (jdoc.isObject())//对象{qDebug() << "json is object";QJsonObject jobj = jdoc.object();if (jobj.contains("age")){qDebug() << "age is: " << jobj.value("age").toInt();}if (jobj.contains("name")){qDebug() << "name is: " << jobj.value("name").toString();}if (jobj.contains("my_array")&&jobj["my_array"].isArray())//数组的key{QJsonArray myArray = jobj["my_array"].toArray();for (const QJsonValue& value : myArray){if (value.isDouble()) {double number = value.toDouble();qDebug() << "Number in array:" << number;}else if (value.isString()) {QString stringValue = value.toString();qDebug() << "String in array:" << stringValue;}else if (value.isBool()) {bool boolValue = value.toBool();qDebug() << "Bool in array:" << boolValue;}}}}}}}}int main(int argc, char* argv[])
{QString filepath = R"(E:\writerJsonObjectIncludeArrary.json)";readJsonObjectIncludeArrary(filepath);return 0;
}

Json文件:writerJsonObjectIncludeArrary.json
在这里插入图片描述
运行效果:
在这里插入图片描述

五、总结

目前本博文介绍了一些较为基础的格式,实际上有些较为复杂的嵌套都是这样的,慢慢进行拆解即可
平常见对象中嵌套数组,Json文件以大括号开头的格式较多些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分块矩阵的转置

证明 则 证明&#xff1a;令&#xff0c;有&#xff0c;对它做一个分块使得和后面的分块矩阵中的是同型矩阵&#xff0c;要证明&#xff08;任意的&#xff09;&#xff0c;需要证明1&#xff09;是一个的矩阵 2&#xff09;任意的 首先证明1&#xff09;我们先定义两个函…

Getting RateLimitError while implementing openai GPT with Python

题意&#xff1a;“在使用 Python 实现 OpenAI GPT 时遇到 RateLimitError 错误。” 问题背景&#xff1a; I have started to implement openai gpt model in python. I have to send a single request in which I am getting RateLimitError. “我开始在 Python 中实现 Ope…

SSH弱口令爆破服务器

一、实验背景 1、概述 使用kali的hydra进行ssh弱口令爆破&#xff0c;获得服务器的用户名和口令&#xff0c;通过 ssh远程登录服务器。 2、实验环境 kali攻击机&#xff1a;192.168.1.107 centos服务器&#xff1a;192.168.1.105 二、前置知识 1、centos设置用户并设置弱…

HR招聘,如何解决面试流程繁琐的问题

要解决面试流程繁琐的问题&#xff0c;就必须要精简和优化招聘流程。比如精简面试环节&#xff0c;制定标准化流程&#xff0c;完善信息管理&#xff0c;对面试环节进行细致梳理之后&#xff0c;尽快识别并去除那些不必要的步骤&#xff0c;这样就能够减少求职者的等待时间&…

IAR软件配置笔记

Project->Optiions->配置Device Debug中配置 C/C Compiler中配置 优化等级 C语法标准选择 回到主界面&#xff0c;Tools->Options 字体调整 Editor更改缩进数 Project->Make编译 调试模式和编辑模式的View菜单栏不一样http://t.csdnimg.cn/JsWjy Disa…

Python | Linux | 解析Himawari-8/9 | Standard Data

写作前面 之前一个相关的工作需要解析Himawari-8/9 Standard Data文件&#xff0c;因为他是二进制的&#xff0c;之前没有处理过&#xff0c;导致完全摸不着头脑。在网上找了中英文搜索找了好久&#xff0c;虽然也找到了公开的解析代码&#xff0c;但是放在自己的数据这感觉总是…

Golang | Leetcode Golang题解之第375题猜数字大小II

题目&#xff1a; 题解&#xff1a; func getMoneyAmount(n int) int {f : make([][]int, n1)for i : range f {f[i] make([]int, n1)}for i : n - 1; i > 1; i-- {for j : i 1; j < n; j {f[i][j] j f[i][j-1]for k : i; k < j; k {cost : k max(f[i][k-1], f[…

字节跳动-生活服务-java后端-一面

基础题 计算机网络 1.tcp三次握手和四次挥手&#xff1f;tcp的第三次握手可以传输应用层数据嘛&#xff1f; 4.1 TCP 三次握手与四次挥手面试题 | 小林coding (xiaolincoding.com) 2.描述一下打开百度首页后发生的网络过程&#xff1f; 计算机网络面试题 | 小林coding (xi…

无损放大图片,盘点5款最新无损放大图片软件

我们常常遇到需要放大图片却又不希望损失画质的尴尬境地。无论是为了打印大幅海报、在线展示高清细节&#xff0c;还是想要修复珍贵的老照片&#xff0c;无损放大图片成为了许多人的迫切需求。下面给大家分享5款最新无损放大图片软件&#xff0c;高效且实用&#xff0c;一起来学…

C++基础练习

1》提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 1 #include<iostream>2 using namespace std;3 4 int main()5 {6 string str1; //定义字符串数据7 cout << "请输入一个字符串>>>" ;8…

好出创新点的方向:SAM做医学图像分割!轻松登Nature!

继MedSAM登上Nature后&#xff0c;牛津大学也最新提出了MedSAM-2&#xff0c;不但分割一切医学图像&#xff0c;还能分割视频&#xff01;准确度提升一个level&#xff0c;直接刷新医学图像分割SOTA榜&#xff01; 这种惊人的医学图像分割效果都得益于SAM模型&#xff08;尤其是…

【html+css 绚丽Loading】 000020 三才流转盘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

AList嵌入动态验证码实现动态校验

前言 晓杰利用ALists创建了个网盘资源站&#xff0c;想着如何增加个动态验证码进行验证后才能进行访问下载&#xff0c;刚开始利用了固定的验证码&#xff0c;用户可以通过JS代码中进行绕过或直接拿到验证码&#xff0c;经过晓杰多次优化&#xff0c;最终版本支持动态获取验证…

Redis 实现哨兵模式

目录 1 哨兵模式介绍 1.1 什么是哨兵模式 1.2 sentinel中的三个定时任务 2 配置哨兵 2.1 实验环境 2.2 实现哨兵的三条参数&#xff1a; 2.3 修改配置文件 2.3.1 MASTER 2.3.2 SLAVE 2.4 将 sentinel 进行备份 2.5 开启哨兵模式 2.6 故障模拟 3 在整个架构中可能会出现的问题 …

一道关于php文件包含的CTF题

一、源码 这是index.php的页面。 点击login后会发现url里多了action的参数&#xff0c;那么我们就可以通过它来获取源码。 ?actionphp://filter/readconvert.base64-encode/resourcelogin.php 再通过base64的解码可以查看源码。 index.php源码&#xff1a; <?php erro…

可拖拽表单设计器都有哪些突出特点?

为了提高效率、降低开发成本&#xff0c;利用低代码技术平台的优势特点可以实现这一目标。究竟什么是低代码技术平台&#xff1f;都有哪些值得夸耀的特点和优势&#xff1f;今天&#xff0c;我们就带着这些问题&#xff0c;一起来了解低代码技术平台、可拖拽表单设计器的多个优…

第一周学习--联邦学习

OUC读研--第一周 目录 1、课程学习 2、fedavg的算法实现 关于代码详解 1、client __init__ 方法 local_train 方法 2、server 3、get_dataset 函数定义 数据集加载 MNIST 数据集 CIFAR-10 数据集 返回值 使用示例 4、 main 代码解释 可能的改进点 5、models …

【项目实用】SpringBoot整合日志功能插件

​分享不易&#xff0c;耗时耗力&#xff0c;麻烦给个不要钱的关注和赞吧 承接毕设指导&#xff0c;技术答疑&#xff0c;学习路上缺少导师的同学可以私信我 更多学习资料&#xff0c;公众号&#xff1a;墨轩学习网&#xff0c;B站&#xff1a;墨轩大楼 一、日志概述 日志记录…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…

网络服务器及IO模型

网络服务器 单循环服务器&#xff1a;服务器在同一时刻只能响应一个客户端的请求 并发服务器模型&#xff1a;服务器在同一时刻可以响应多个客户端的请求 实现TCP并发服务器 1.多进程 2.多线程 3.IO多路复用&#xff1a; 为了解决进程或线程阻塞到某个 I/O 系统调用而出现的…