Qt 中用 json 就是這麼簡單, 使用 QVariant , 強烈推薦, 五星級推薦
不要談效率, 二進制(protobuf 等) 比 json 快. 只講便捷.
例如:
{
"hai": "QQ",
"ye": [
4, 1, 9, 0, 8, 7, 1, 3, 7
]
}
這裏可以對 json 格式化校驗: http://www.bejson.com/
//構造
//口訣: 遇到 { 括號用 QVariantMap
// 遇到 [ 括號用 QVariantList
// 是不是超簡單?
QVariantMap map;
map.insert("hai","QQ");
QVariantList yeList;
QStringList list;
list<<"4"<<"1"<<"9"<<"0"<<"8"<<"7"<<"1"<<"3"<<"7";
for(int i=0; i<list.size(); ++i){
yeList.append(QString(list.at(i)).toInt());
}
map.insert("ye",yeList);
QByteArray jsonByteArray = qVariantToByteArray(map);
qDebug()<<"map:"<<map;
qDebug()<<"json:"<<QString(jsonByteArray);
//解析:
//口訣: 遇到 { 括號就 .toMap()
// 遇到 [ 括號就 .toList()
QVariant jsonVar = getJsonVariant(jsonByteArray);
qDebug()<<"hai:"<<jsonVar.toMap().value("hai").toString();
QVariantList reYeList = jsonVar.toMap().value("ye").toList();
qDebug()<<"ye:"<<reYeList;
foreach (auto var, reYeList) {
qDebug()<<var.toInt();
}
輸出:
Starting D:\QtDemo\2019\10\build-MyCobomBox-Qt_5_12_1_mingw73_64-Release\release\MyCobomBox.exe...
map: QMap(("hai", QVariant(QString, "QQ"))("ye", QVariant(QVariantList, (QVariant(int, 4), QVariant(int, 1), QVariant(int, 9), QVariant(int, 0), QVariant(int, 8), QVariant(int, 7), QVariant(int, 1), QVariant(int, 3), QVariant(int, 7)))))
json: "{\n \"hai\": \"QQ\",\n \"ye\": [\n 4,\n 1,\n 9,\n 0,\n 8,\n 7,\n 1,\n 3,\n 7\n ]\n}\n"
hai: "QQ"
ye: (QVariant(int, 4), QVariant(int, 1), QVariant(int, 9), QVariant(int, 0), QVariant(int, 8), QVariant(int, 7), QVariant(int, 1), QVariant(int, 3), QVariant(int, 7))
4
1
9
0
8
7
1
3
7
#include <QVariantList>
#include <QVariantMap>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
//Json 文件轉成QVariant
QVariant getJsonVariant(const QString &filePath)
{
QByteArray json;
QFileInfo fileInfo(filePath);
if(fileInfo.isFile()){
QFile file(fileInfo.absoluteFilePath());
if(file.open(QIODevice::ReadOnly)){
json = file.readAll();
file.close();
}
}else{
qWarning()<<fileInfo.filePath()<<"is not a file";
}
return getJsonVariant(json);
}
//json 數據轉 QVariant
QVariant getJsonVariant(const QByteArray &json)
{
QJsonParseError error;
QVariant var;
QJsonDocument jsonDocument = QJsonDocument::fromJson(json, &error);
if (error.error == QJsonParseError::NoError) {
if (!(jsonDocument.isNull() || jsonDocument.isEmpty())) {
if (jsonDocument.isObject()) {
var = jsonDocument.toVariant().toMap();
}else if(jsonDocument.isArray()){
var = jsonDocument.toVariant().toList();
}
}else{
qDebug()<<"jsonDocument.isEmpty()";
}
}else{
qWarning()<<error.errorString().toUtf8().constData();
}
return var;
}
//QVariant to QByteArray
QByteArray qVariantToByteArray(const QVariant &var){
QByteArray data;
if(!var.isNull()){
switch (var.type()) {
case QVariant::ByteArray:
data = var.toByteArray();
break;
case QVariant::Map:
case QVariant::List:
data = QJsonDocument::fromVariant(var).toJson(QJsonDocument::Indented);
break;
case QVariant::String:
data = var.toString().toLocal8Bit();
break;
default:
break;
}
}
return data;
}
使用 QVariant 優點: Qt 內部數據傳輸,UI 控件數據綁定, 便捷不用二次轉換,對於比較大的json文件無法解析, 具體沒測試多大的文件.
缺點: 無法對 double 進行小數點截斷 (QJsonObject 也不行, 非官方 QJSON 可以)