0
点赞
收藏
分享

微信扫一扫

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

殇感故事 2024-05-08 阅读 10
qtjson

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

举报

相关推荐

0 条评论