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

news2024/10/5 13:55:12

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

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

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

相关文章

JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式

技术栈 1. 开发语言&#xff1a;JAVA 2. 数据库&#xff1a;MySQL 3. 后端框架&#xff1a;Spring boot 4. 前端框架&#xff1a;VUE2 5. 电子班牌&#xff1a; Android 7.1 6. 小程序&#xff1a;原生开发 7. 多学校Saas 模式 电子班牌是一款智慧校园管理工具&#xf…

Kubernetes核心概念基本操作

1.1 Namespace命名空间 1.1.1 Namespace核心概念 Kubernetes 的 Namespace&#xff08;命名空间&#xff09;是一种用于创建逻辑隔离分区的机制&#xff0c;它的主要作用是用来实现多套环境的资源隔&#xff0c;它允许用户在同一个物理集群中模拟出多个虚拟集群的效果。以下是…

cmake的使用方法: 将源文件组织到不同的目录

一. 简介 前面几篇文章学习了cmake工具针对单个 .c文件的编译方法。 cmake针对含有多个 .c文件的工程的使用编译。cmake工程编译是如何实现编译生成库文件。 本文学习一下另一种情况&#xff1a;当源文件组织到不同的目录下时&#xff0c;cmake工具该如何编译工程。 二. c…

C++继承 - 下

目录 1. 继承和友元 2. 继承与静态成员 3. 菱形继承以及菱形虚拟继承 3.1. 单继承 3.2. 多继承 3.3. 菱形继承 3.4. 菱形虚拟继承 3.5. 菱形继承的底层细节 3.6. 菱形虚拟继承的底层细节 3.7. 虚拟继承 4. 继承的总结 5. 相关继承练习题 5.1. 如何定义一个无法被继…

Android:弹出对话框方式梳理一览(一)

Android&#xff1a;弹出对话框方式梳理一览&#xff08;一&#xff09; Guide&#xff5c;导言 在Android开发中&#xff0c;对话框可能是我们与用户交互的非常常用的方式&#xff0c;包括弹出一个小界面&#xff0c;可能在实际场景中都非常实用。本篇文章主要就是对Android弹…

陪诊系统|陪诊小程序成品|陪诊系统功能

随着人们对健康的日益关注以及医疗技术的不断进步&#xff0c;陪诊小程序应运而生&#xff0c;通过提供陪同就医、医疗服务和健康管理等功能为患者和家庭成员提供了更多的便利和选择。本文将分析陪诊小程序的关键功能&#xff0c;以便更好地理解其在医疗领域的作用。 在陪诊小程…

分布式任务调度工具 XXL-JOB

默认的账号密码是&#xff1a;admin/123456 一&#xff0c;部署docker容器 docker run \ -e PARAMS"--spring.datasource.urljdbc:mysql://192.168.150.101:3306/xxl_job?Unicodetrue&characterEncodingUTF-8 \ --spring.datasource.usernameroot \ --spring.dataso…

GT资源-Clock资源

一、Transmitter 时钟分布 XCLK&#xff1a;在使用TX buffer的模式下&#xff0c;XCLK来源于TXOUTCLK。在使用TX bypassing的模式下XCLK来源于TXUSERCLK。TXUSRCLK是GTX/GTH中PCS的内部逻辑时钟。TXUSRCLK2是GT Transceiver 用户侧逻辑时钟。 TXUSRCLK与TXUSRCLK2的关系 FPGA …

阿赵UE引擎C++编程学习笔记——信息打印输出

大家好&#xff0c;我是阿赵。   在之前介绍HelloWorld的时候&#xff0c;使用了一个打印的命令&#xff0c;把HelloWorld输出到输出日志里面。   对于我们编写程序代码来说&#xff0c;有2个手段是对程序差错非常重要的&#xff0c;一个是断点&#xff0c;另外一个是输出日…

很快就可以试用Domino 15了

大家好&#xff0c;才是真的好。 前几天在比利时的安普卫特举办的Engage2024大会已经结束&#xff0c;流出的现场照片很多&#xff0c;主要是会议场地照片很多&#xff0c;说是令人震撼&#xff1b;可惜这次一手的PPT和会议内容不多.是的&#xff0c;本来我也是在等与会者写的…

安装Jupyter notebook NbExtensions遇到的问题

在安装 Jupyter notebook NbExtensions 时&#xff0c;使用下列代码&#xff1a; pip install jupyter_nbextensions_configurator jupyter_contrib_nbextensions jupyter contrib nbextension install --user jupyter nbextensions_configurator enable --user ——————…

获取京东商品详情,API返回值说明全攻略

京东商品详情API是开发者获取京东平台上商品详细信息的重要工具。通过调用API并解析返回的响应数据&#xff0c;您可以快速获取商品的各项属性&#xff0c;如商品ID、标题、价格、图片等。下面&#xff0c;我们将为您详细介绍京东商品详情API的返回值说明&#xff0c;帮助您更好…

(五)JVM实战——JVM性能调优与监控

JVM调优案例的场景 为什么要调优&#xff1a;防止或者解决jvm虚拟机中的OOM问题&#xff1b;减少FullGC出现的频率&#xff0c;解决系统运行卡、慢问题JVM调优案例的四个方面 OOM(堆溢出)&#xff1a;java heap spaceOOM(元空间溢出)&#xff1a;MetaspaceOOM(GC overhead lim…

【Android项目】“追茶到底”项目介绍

没有多的介绍&#xff0c;这里只是展示我的项目效果&#xff0c;后面会给出具体的代码实现。 一、用户模块 1、注册&#xff08;第一次登陆的话需要先注册账号&#xff09; 2、登陆&#xff08;具有记住最近登录用户功能&#xff09; 二、点单模块 1、展示饮品列表 2、双向联动…

k8s 资源文件参数介绍

Kubernetes资源文件yaml参数介绍 yaml 介绍 yaml 是一个类似 XML、JSON 的标记性语言。它强调以数据为中心&#xff0c;并不是以标识语言为重点例如 SpringBoot 的配置文件 application.yml 也是一个 yaml 格式的文件 语法格式 通过缩进表示层级关系不能使用tab进行缩进&am…

软考是否存在包过班?

国家考试&#xff0c;虽然有人喊着包过&#xff0c;但你也别轻易相信啊&#xff0c;姐妹&#xff0c;要好好保护好你的钱包啊&#xff01;这种考试是没有所谓的包过的。 给你一些学习软考需要注意的要点&#xff1a; 1、深入理解考试内容&#xff1a; 在准备软考之前&#xf…

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

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

自动化测试再升级,大模型与软件测试相结合

近年来&#xff0c;软件行业一直在迅速发展&#xff0c;为了保证软件质量和提高效率&#xff0c;软件测试领域也在不断演进。如今&#xff0c;大模型技术的崛起为软件测试带来了前所未有的智能化浪潮。 软件测试一直是确保软件质量的关键环节&#xff0c;但传统的手动测试方法存…

linux系统-部署YUM仓库及NFS共享服务

目录 一、YUM概述 二、准备安装源 软件仓库的提供方式 RPM软件包的来源 构建Centos7软件仓库 在软件仓库中加入非官方RPM包组 三、搭建yum软件仓库 四、NFS文件共享服务 NFS简介 使用NFS发布共享资源&#xff08;安装nfs-utils、rpcbird软件包&#xff09; 设置共享目…

记一次DNS故障导致用户无法充值的问题(上)

背景&#xff1a; 刚刚过去了五一劳动节&#xff0c;回来后一上班接到客服运营团队反馈的节日期间的问题&#xff0c;反馈有部分用户无法充值。拿到的反馈资料有&#xff1a; 无法充值操作视频、问题时间、手机机型、手机网络情况。 1、从视频中看到用户点击支付后没有任何反…