QT开发(四) 制作一个JSON检查小工具

1、JSON概念

1.1 定义

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人类阅读和编写,同时也易于机器解析和生成。JSON基于JavaScript语言的子集,但是独立于编程语言,因此可以被多种编程语言支持和解析。

1.2 应用场景

  • 在Web开发中,JSON常用于前后端数据交换,比如通过AJAX请求从服务器获取数据。
  • 在移动应用开发中,JSON常用于移动端与服务器之间的数据交换。
  • 在配置文件中,JSON可以用于存储和传输配置信息。
  • 在日志记录中,JSON可以用于结构化日志数据。

1.3 压缩

格式压缩(JSON Compression)指的是通过一些技术手段减小JSON数据的大小,以减少网络传输时的带宽占用和加快数据传输速度。常见的压缩技术包括删除空格、压缩键名、使用短的键名等。

1.4 转义

格式转义(Escape Characters)指的是在JSON中转义特殊字符,以确保JSON字符串的正确性。在JSON中,一些特殊字符如双引号、反斜杠等需要进行转义,即在字符前加上反斜杠\。例如,"Hello, \"World\""中的双引号和反斜杠就是被转义的特殊字符。转义可以确保JSON解析器正确解析JSON字符串。

2、设计

界面设计如下:

控件定义如下:

控件名称文本内容
Text EditJsonText
Push ButtoncheckBtn检查
Push ButtonescapeButton压缩
Push ButtonunescapeButton压缩还原
Push ButtonescapeBtn转义
Push ButtonunescapeBtn转义还原
Push ButtonclearBtn清空

3、编码

3.1 检查功能

检查功能用来检查Json字符串的格式是否规范,编码如下:

void MainWindow::validateJson()
{QString inputJson = ui->JsonText->toPlainText();QJsonParseError error;QJsonDocument::fromJson(inputJson.toUtf8(), &error);if (error.error != QJsonParseError::NoError){int errorPosition = error.offset;QString errorSnippet = inputJson.mid(errorPosition, 20); // 获取错误位置前后20个字符QMessageBox::critical(this, "JSON Validation", "Invalid JSON format at position " + QString::number(errorPosition) + ": " + error.errorString() + "\nError snippet: " + errorSnippet);}else{QMessageBox::information(this, "JSON Validation", "JSON is OK!");}
}

3.2 压缩功能

将Json字符串进行压缩,编码如下:

QString compress(QString& jsonString)
{QString compressedJson;bool insideQuotes = false;for (const QChar& c : jsonString){if (c == '"'){insideQuotes = !insideQuotes;}if (!c.isSpace()){compressedJson += c;}else if (insideQuotes){compressedJson += c;}}return compressedJson;
}void MainWindow::compressJson()
{QString inputJson = ui->JsonText->toPlainText();QString compressedJson = compress(inputJson);ui->JsonText->setPlainText(compressedJson);
}

3.3 压缩还原功能

将压缩后的Json字符串进行还原,编码如下:

QString decompress(QString& compressedJson)
{QString decompressedJson;bool insideQuotes = false;for (const QChar& c : compressedJson){if (c == '"'){insideQuotes = !insideQuotes;}if (!c.isSpace() || insideQuotes){decompressedJson += c;}}return decompressedJson;
}void MainWindow::decompressJson()
{QString compressedJson = ui->JsonText->toPlainText();QString decompressedJson = decompress(compressedJson);ui->JsonText->setPlainText(decompressedJson);
}

3.4 转义功能

将Json字符串进行转义,添加代码如下:

QString escapeJsonQuotes(const QString& jsonString)
{QString escapedJson;for (const QChar& c : jsonString){if (c == '"'){escapedJson += "\\\"";}else{escapedJson += c;}}return escapedJson;
}void MainWindow::escapeJson()
{QString inputJson = ui->JsonText->toPlainText();QString escapedJson = escapeJsonQuotes(inputJson);ui->JsonText->setPlainText(escapedJson);
}

3.5 转义还原功能

将转义Json字符串进行还原,添加代码如下:

QString unescapeJsonQuotes(const QString& escapedJson)
{QString unescapedJson;bool escapeFlag = false;for (int i = 0; i < escapedJson.length(); ++i){QChar c = escapedJson.at(i);if (escapeFlag){if (c == '"'){unescapedJson += '"';}else{unescapedJson += '\\';unescapedJson += c;}escapeFlag = false;}else if (c == '\\'){escapeFlag = true;}else{unescapedJson += c;}}return unescapedJson;
}void MainWindow::unescapeJson()
{QString inputJson = ui->JsonText->toPlainText();QString escapedJson = unescapeJsonQuotes(inputJson);ui->JsonText->setPlainText(escapedJson);
}

3.6 其它

添加信号和槽:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 检查字符串格式connect(ui->checkBtn, &QPushButton::clicked, this, &MainWindow::validateJson);// 压缩Json字符串connect(ui->escapeButton, &QPushButton::clicked, this, &MainWindow::compressJson);// 重新格式化json字符串connect(ui->unescapeButton, &QPushButton::clicked, this, &MainWindow::decompressJsonToFormatted);// 转义字符串connect(ui->escapeBtn, &QPushButton::clicked, this, &MainWindow::escapeJson);// 还原转义connect(ui->unescapeBtn, &QPushButton::clicked, this, &MainWindow::unescapeJson);// 清空文本框connect(ui->clearBtn, &QPushButton::clicked, [this](){ui->JsonText->clear();});
}

添加头文件中的声明:

class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
public slots:void validateJson();void escapeJson();void unescapeJson();void compressJson();void decompressJson();void decompressJsonToFormatted();
private:Ui::MainWindow *ui;
};

4、测试

4.1 检查测试

输入正确格式字符串检查测试:

输入错误格式进行检查:

4.2 压缩测试

将4.1中正确格式的Json字符串进行压缩:

4.3 压缩还原测试

将4.2压缩后的字符串进行还原:

4.4 转义测试

将4.3中Json字符串先压缩再转义:

4.5 转义还原测试

目前程序只支持将转义一次的字符串进行还原,4.4中转义的字符串还原如下:

5、总结

本文讲解了Json字符串的一些常用概念,使用QT编写了一个小工具实现对Json字符串的格式检查、压缩、解压缩、转义、转义还原等功能。

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

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

相关文章

根据相同的key 取出数组中最后一个值

数组中有很多对象 , 需根据当前页面的值current 和 数组中的key对比 拿到返回值 数据结构如下 之前写法 const clickedItem routeList.find(item > item.key current) // current是当前页 用reduce遍历数组返回最后一个值 const clickedItem routeList.reduce((lastIte…

RocketMQ:高性能、可靠的消息中间件

引言&#xff1a; 在当今的分布式系统中&#xff0c;消息中间件扮演着至关重要的角色。它们作为不同服务之间的桥梁&#xff0c;负责解耦、异步通信和流量削峰等功能。RocketMQ&#xff0c;作为一款高性能、可靠、易扩展的消息中间件&#xff0c;受到了广大开发者的青睐。 一…

音频可视化:原生音频API为前端带来的全新可能!

音频API是一组提供给网页开发者的接口&#xff0c;允许他们直接在浏览器中处理音频内容。这些API使得在不依赖任何外部插件的情况下操作和控制音频成为可能。 Web Audio API 可以进行音频的播放、处理、合成以及分析等操作。借助于这些工具&#xff0c;开发者可以实现自定义的音…

【网络】传输层的特点总结

1传输层协议 传输层主要有两个常见的协议&#xff1a;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;。TCP 提供可靠的、面向连接的通信服务&#xff0c;适用于对数据传输可靠性要求高的场景&#xff0c;如网页浏览、文件传输等。而 UD…

算法学习笔记(最短路——Bellman-Ford)

B e l l m a n — F o r d Bellman—Ford Bellman—Ford是一种单源最短路径算法&#xff0c;可以用于边权为负的图&#xff0c;但是只能用于小图。 大概过程&#xff1a; 枚举每一条边&#xff0c;更新可以更新的节点&#xff08;起点到自己距离为 0 0 0&#xff0c;从地点开…

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

wordpress外贸建站公司歪建站新版网站上线

wordpress外贸建站公司 歪猫建站 歪猫WordPress外贸建站&#xff0c;专业从事WordPress多语言外贸小语种网站建设与外贸网站海个推广、Google SEO搜索引擎优化等服务。 https://www.waimaoyes.com/dongguan

一种基于图搜索的全局/局部路径避障策略

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一种基于图搜索的全局/局部路径避障策略前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对一种基于图搜索…

TypeScript 中,泛型和接口之间有什么联系和区别?

在TypeScript中&#xff0c;泛型和接口是两种不同的概念&#xff0c;但它们可以一起使用来增强代码的类型安全性和灵活性。下面我们来探讨它们之间的联系和区别。 联系 类型安全性&#xff1a;泛型和接口都用于提高代码的类型安全性。通过使用泛型和接口&#xff0c;你可以在编…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写&#xff1a;write函数中一个进程写没问题&#xff0c;两进程写&#xff1a;第一个进程运行到kzalloc时&#xff0c;第二个进程也执行了kzalloc&#xff0c;只第二个进程地址保存在c中&#xff0c;第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

题目:排序疑惑

问题描述&#xff1a; 解题思路&#xff1a; 做的时候没想到&#xff0c;其实这是以贪心题。我们可以每次排最大的区间&#xff08;小于n&#xff0c;即n-1大的区间&#xff09;&#xff0c;再判断是否有序 。因此只需要分别判断排&#xff08;1~n-1&#xff09;和&#xff08;…

我独自升级崛起下载教程 我独自升级崛起一键下载

动作RPG游戏基于广大喜爱的动画和在线漫画《我独自升级崛起》在5月8日&#xff0c;这款新的游戏首次在全球亮相&#xff0c;意在给那些对游戏情有独钟的玩家带来更加丰富和多种多样的游戏体验。这个网络武侠题材的游戏设计非常具有创意&#xff0c;其主要故事围绕着“独孤求败”…

商业银行业务文件归档范围和档案保管期限

商业银行业务文件归档范围和档案保管期限 对公信贷业务文件归档范围和档案保管期限表 序号 归档范围 保管期限 备注 1 借款人、担保人基本资料 1.1 营业执照或事业法人证书 10年 1.2 法人授权委托证明书 10年 1.3 法定代表人身份证明 10年 1.4 特殊…

Dataframe数据类型相关问题汇总及处理方法

1. dataframe结构下有一列数据&#xff0c;有一部分是int类型&#xff0c;另一部分是object类型。当数据是int类型时&#xff0c;返回其本身&#xff0c;当是object类型时&#xff0c;采用其他处理方式&#xff1b; 使用lambda 和isinstance来实现&#xff1a; isinstance(x,…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

微信小程序开发:揭秘路由与页面跳转的艺术

微信小程序开发&#xff1a;揭秘路由与页面跳转的艺术 引言 在微信小程序的开发过程中&#xff0c;页面间的路由与跳转是构建用户交互体验的关键一环。不同于传统的Web开发&#xff0c;微信小程序的路由系统有其独特之处。本文将深入探讨微信小程序中路由的基本概念、作用以及…

【字符串】Leetcode 二进制求和

题目讲解 67. 二进制求和 算法讲解 为了方便计算&#xff0c;我们将两个字符串的长度弄成一样的&#xff0c;在短的字符串前面添加字符0&#xff1b;我们从后往前计算&#xff0c;当遇到当前计算出来的字符是> 2’的&#xff0c;那么就需要往前面进位和求余 注意&#xf…

【个人博客搭建】(18)使用Quartz.NET 定时备份数据库

Quartz.NET在系统主要承担的一些关键功能&#xff1a; 任务调度&#xff1a;Quartz.NET 允许开发人员创建、调度和管理定时任务&#xff0c;支持简单触发器和Cron表达式等多样化的触发策略。灵活性&#xff1a;Quartz.NET 提供了灵活的任务安排机制&#xff0c;不仅支持基于时间…

在企业中软件产品测试报告可以运用的场景

在企业应用场景中&#xff0c;测试报告的应用场景十分广泛且重要。以下是几个主要的应用场景&#xff1a; 产品质量评估与保证&#xff1a;测试报告是企业评估软件或产品质量的重要依据。通过测试报告&#xff0c;企业可以了解产品在不同场景下的性能表现、安全性、稳定性以及…

1.4 初探JdbcTemplate操作

实战目的 掌握Spring框架中JdbcTemplate的使用&#xff0c;实现对数据库的基本操作。理解数据库连接池的工作原理及其在实际开发中的重要性。通过实际操作&#xff0c;加深对Spring框架中ORM&#xff08;对象关系映射&#xff09;的理解。 关键技术点 JdbcTemplate操作&…