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 可以)