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

发布于:2024-05-07 ⋅ 阅读:(30) ⋅ 点赞:(0)

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 Edit JsonText
Push Button checkBtn 检查
Push Button escapeButton 压缩
Push Button unescapeButton 压缩还原
Push Button escapeBtn 转义
Push Button unescapeBtn 转义还原
Push Button clearBtn 清空

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