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