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_OBJECT

public:
    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字符串的格式检查、压缩、解压缩、转义、转义还原等功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说&#xff0c;就是有三个柱子&#xff0c;分别为A柱&#xff0c;B柱&#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘&#xff0c;我们需要借助B柱和C柱&#xff0c;将A柱上的所有圆盘转移到C柱上&#xff0c;并且一次只能移动一个圆盘&#…

【Qt QML】Qt Quick Scene Graph

Qt Quick 2是一个用于创建图形界面的库&#xff0c;它使用一个专门的场景图&#xff08;Scene Graph&#xff09;来进行渲染。通过使用OpenGL ES、OpenGL、Vulkan、Metal或Direct 3D等图形API&#xff0c;Qt Quick 2可以有效地优化图形渲染过程。使用场景图而不是传统的命令式绘…

1688工厂货源API接口:用于商品采集、商品搜索、商品详情数据抓取

item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品&#xff08;拍立淘&#xff09;item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得店铺的所有商品item_password 获得淘口令…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

神经网络怎么把隐含层变量融合到损失函数中?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

matplotlib和pandas与numpy

1.matplotlib介绍 一个2D绘图库&#xff1b; 2.Pandas介绍&#xff1a; Pandas一个分析结构化数据的工具&#xff1b; 3.NumPy 一个处理n纬数组的包&#xff1b; 4.实践&#xff1a;绘图matplotlip figure()生成一个图像实例 %matplotlib inline&#xff1a;图形直接在…

前端传递list(数组)类型参数,后端接收失败

一顿报错,我之前遇到的list都是Long类型 貌似用GET也是可以的,但是很奇怪一直报错 就是不可以 后来去百度 查询到可以用两种方法解决这个问题 1、拆开 传 以GET方式&#xff0c;后端GetMappingRequestParam接收。 2、以Post方式传&#xff0c;后端创建dto PostMappingReques…

elementUI table表格相同元素合并行----支持多列

效果图如下: vue2代码如下&#xff1a; 只粘贴了js方法哦&#xff0c; methods: {// 设置合并行 setrowspans() { const columns [‘name’, ‘value’]; // 需要合并的列名 // 为每个需要合并的列设置默认 rowspan this.tableData.forEach(row > { columns.forEach(col …

光电探测器性能指标测试

光电探测器的三个核心指标&#xff1a; 带宽&#xff0c;转换增益&#xff0c;噪声(信噪比&#xff0c;NEP&#xff0c;噪声密度) 测试环境&#xff1a;可调谐激光器&#xff08;CW LASER&#xff09;&#xff0c;强度调制器(AM)&#xff0c;信号发生器(AWG)&#xff0c;可调衰…

【算法】滑动窗口——最大连续1的个数

本篇文章讲的是“最大连续1的个数”这道题&#xff0c;从最开始的简单暴力到用滑动窗口算法实现解题的思路历程&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解3.滑动窗口解法3.1优化一&#xff1a;end重返start优化&#xff0c;end指针不回退3.2优化二&#xff1a;某一st…

Day_2

1. 菜品管理 新增菜品 接口设计 1. 根据类型查询分类&#xff08;分类管理已完成&#xff09; 查看接口文档即可 2. 文件上传 创建Bucket 采用的是阿里云的OSS对象存储服务 新增AccessKey 3. 菜品的新增逻辑 代码开发 1. 文件上传接口开发 为了提高代码的解耦性&#…

Java_方法引用

方法引用就是把已经有的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体。 条件&#xff1a; 1.引用处需要是函数式接口 2.被引用的方法需要已经存在 3.被引用的方法的形参和返回值需要跟抽象方法的形参和返回值保持一致 4.被引用方法的功能需要满足当前的要求 简…

ATA-2161高压放大器用途有哪些种类

高压放大器是一种电子设备&#xff0c;其主要功能是将输入信号放大到较高的电压水平&#xff0c;同时保持信号的形状和特性。这种设备在各种应用领域中都有重要作用&#xff0c;它的种类繁多&#xff0c;根据不同的用途可以分为多种类型。 1.医学领域 在医学设备中&#xff0c;…

搭建Harbor仓库

文章目录 Harbor仓库搭建Harbor仓库安装 docker 服务修改配置文件 Harbor仓库 搭建Harbor仓库 下载 Harbor 仓库 安装 docker 服务 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-m…

notepad++安装 hex-editor插件

打开notepad 点击插件 搜索 hex-editor,点击右侧 安装install 安装成功后&#xff0c;在已安装插件中就有显示了

Java性能优化(五)-多线程调优-Lock同步锁的优化

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…

《QT实用小工具·五十九》随机图形验证码,带有一些可人的交互与动画

1、概述 源码放在文章末尾 该项目实现了可交互的动画验证码控件&#xff0c;趣味性十足&#xff1a; 字符变换动画 噪音动画 可拖动交互 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef CAPTCHAMOVABLELABEL_H #define CAPTCHAMOVABLELABEL…

【影片欣赏】【指环王】【魔戒:护戒使者 The Lord of the Rings: The Fellowship of the Ring】

2001年发行&#xff0c;Extended DVD Edition Part One 1. Prologue: One Ring to Rule Them All… 2. Concerning Hobbits 3. The Shire 4. Very Old Friends 5. A Long-expected Party 6. Farewell Dear Bilbo 7. Keep It Secret, Keep It Safe 8. The Account of Isildur 9…

MyBatis入门例子

1、建立与数据库对应的POJO类 2、建立mybatis的配置文件 修改后如下&#xff1a; 3、创建POJO对象和Mysql数据的表之间的映射配置 4、建一个测试方法 实现从数据库中取数一条数据&#xff0c;封装成User对象返回 注意点&#xff1a; 这点&#xff0c;大家应该不陌生了&#x…

28-代码随想录18四数之和

18. 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff…