Qt之JSON教程-实战篇

以实战例子讲述JSON三兄弟的后续故事。

实战一:发送JSON网络请求

  作为JSON老大哥的QJsonValue自知对面的大户人家妹子貌美如花,心里已经打起算盘,先下手为强,后下手遭殃。决定显示下自己的家底,想起这件事,老大哥回想到5年前错过的妹子,当时妹子说我们不适合,大哥问,我对你还不够好么。但妹子说了一句让老大哥彻底伤心的话。做我的男朋友要有QQ会员,可惜你不是

  老大哥找了QNetworkAccessManager以json的方式发送自己的QQ会员和账号,以表明自己的诚意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
QJsonArray jsonArray;
jsonArray<<1<<2<<3;

QJsonObject jsonObject;
jsonObject["account"] = "xxxxx";
jsonObject["vip"] = "8";
jsonObject["array"] = jsonArray;

QNetworkAccessManager manager;
QNetworkRequest request(QUrl("https://www.example.com"));
request.setRawHeader("Content-Type", "application/json");

QNetworkReply* reply = manager.post(request,
QJsonDocument(jsonObject).toJson());
QEventLoop eventLoop;
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec(); // 进入等待返回,但ui事件循环依然进行。

QByteArray result = reply->readAll();
qDebug()<<result;

  躲着墙角的二哥QJsonObject看到了老大哥的一举一动,暗暗窃喜,还好我也是QQ会员,于是在发送数据处做了些小修改以彰显自己的QQ会员等级。

1
2
3
4
5
6
7
QNetworkReply* reply = manager.post(request, R"(
{
"account": "xxxxx",
"vip": "8",
"array": [1, 2, 3]
}
)");

  看起来简单明了,妹子肯定是我的了。二哥,心里暗暗窃喜。

  螳螂捕蝉黄雀在后,三弟QJsonArray手拿银子默念,大哥和二哥都不让下弟弟的,尽是QQ会员,还好我不赖,昨天问了爹爹拿钱充了vip8。三弟也发自己的QQ会员过去了,只是方式略有个性。

1
2
QNetworkReply* reply = manager.post(request, 
"{\"account\":\"xxxxx\",\"vip\":\"8\",\"array\":[1,2,3]}");

  三兄弟按照昨天约定的时间到村口客栈见面。看到妹子赶紧走上前表示自己的QQ会员等级有多高,大哥还没说出话来就被大妹子打断了,说你装载JSON数据麻烦!转头又说二哥虽然简洁,但过于占地方。三弟自然看到面前这么凶恶的妹子,自然不敢说话低着头说,数据反斜杠转义过多,不利于数据操作。

  三兄弟非常灰心,原来QQ会员也帮不到我了。

实战二:读写json格式的配置文件

  老大哥垂头丧气说,QQ会员也没有用了呀,仍了可惜,不如我们埋了它,当是埋葬我们逝去的青春。二哥三弟听后感动得不要不要的,就赶紧拿了家里祖传的铲子挖泥了。他们将QQ信息放()在一个叫config.json的酒壶里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
QJsonObject jsonObject;
jsonObject["account"] = "xxxxx";
jsonObject["password"] = "xxxxx"
jsonObject["vip"] = "8";
QJsonArray jsonArray { 1, 2, 3 };

jsonObject["array"] = jsonArray;
QFile file("config.json");
if (! file.open(QIODevice::WriteOnly)) {
qDebug()<<"文件打开失败。";
return false;
}

QByteArray data = QJsonDocument(jsonObject).toJson();
file.write(data);
file.close();

  一天晚上管家拿着铲子在挖泥,手里捧着他们三兄弟前几天放的青春。管家碎碎念说了一句,终于拿到你们的QQ了,还是会员。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
QFile file("config.json");
if (! file.open(QIODevice::ReadOnly)) {
qDebug()<<"文件打开失败。";
return false;
}

QByteArray data = file.readAll();
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
if (jsonError.error != QJsonParseError::NoError) {
qDebug()<<"Json文件解析错误。";
return false;
}

if (jsonDoc.isObject()) {
QJsonObject jsonObject = jsonDoc.object();
qDebug()<<jsonObject;
}
else if (jsonDoc.isArray()) {
QJsonArray jsonArray = jsonDoc.array();
qDebug()<<jsonArray;
}
else {
qDebug()<<"Json文件解析为空。";
}

file.close();


  • 文章首发于微信公众号:Qt君