介绍:负责封装JSON对象,是键/值对列表,其中键是惟一的字符串,值由QJsonValue表示。
1——QJsonObjec:封装了Json里的对象
接口与QMap相似,都具有size()、insert()和remove()等操作,还可以使用标准C++迭代器模式对其内容进行迭代。
使用示例:
如下图所示:我们要写入这个数据的话,怎么写进去?
QJsonObject gObj = JSONDATA.getSpecifyGroup(m_iSelectBtnIndex);
//这里读取第一个QJsonObject对象,你可以按照你的需求自己去看
//接下来我们就一层一层的读进去就可以了
//新增加effect
QJsonArray chValueArray;
for(int i = 0 ; i < ui->cbLightChanleNum->currentText().toInt() ; i++)
{
chValueArray.append(QJsonValue(0));
}
QJsonObject eObj = gObj[JSONKEY::EFFECT_JSONKEY].toObject() ;
QStringList keys = eObj.keys();
for(int i=0;i<keys.size();i++)
{
QJsonObject sEobj = eObj[keys.value(i)].toObject();
QJsonArray pArry = eObj[JSONKEY::PROGRAM_JSONKEY].toArray();
for(int j=0; j<pArry.size();j++)
{
QJsonObject stepObj = pArry.at(i).toObject();
for(int k = 0; k < addrArray.size(); k++)
{
stepObj.insert(QString::number(addrArray.at(k).toInt()),QJsonValue(chValueArray));
}
pArry.replace(j,stepObj);
}
sEobj[JSONKEY::PROGRAM_JSONKEY] = pArry;
eObj[keys.value(i)]=sEobj;
}
gObj[JSONKEY::EFFECT_JSONKEY] = eObj;
JSONDATA.setSpecifyGroup(m_iSelectBtnIndex,gObj);//这里是封装的存入Json文件的接口
记住一点就可以,[]前面的就是 Json数组格式,{}就是个Json对象格式
2——QJsonArray: 封装了Json里的数组
3——QJsonDocument:转换器
上文知JSON一共有两种格式,即JSON数组和JSON对象,它们最终要利用JSON完成序列化,将数据转换为对应的字符串,或者有另外一种情况是字符串转换为JSON数组和JSON对象。
简单的JSON对象
{
"Cross Platform": true,
"From": 1991,
"Name": "Qt"
}
生成:
// 构建 JSON 对象
QJsonObject json;
json.insert("Name", "Qt");
json.insert("From", 1991);
json.insert("Cross Platform", true);
// 构建 JSON 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
qDebug() << strJson;
简单的JSON解析
QJsonParseError jsonError;
// 转化为 JSON 文档
QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);
// 解析未发生错误
if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
{
if (doucment.isObject())
{
// JSON 文档为对象
QJsonObject object = doucment.object(); // 转化为对象
if (object.contains("Name"))
{ // 包含指定的 key
QJsonValue value = object.value("Name"); // 获取指定 key 对应的 value
if (value.isString())
{ // 判断 value 是否为字符串
QString strName = value.toString(); // 将 value 转化为字符串
qDebug() << "Name : " << strName;
}
}
if (object.contains("From"))
{
QJsonValue value = object.value("From");
if (value.isDouble())
{
int nFrom = value.toVariant().toInt();
qDebug() << "From : " << nFrom;
}
}
if (object.contains("Cross Platform"))
{
QJsonValue value = object.value("Cross Platform");
if (value.isBool())
{
bool bCrossPlatform = value.toBool();
qDebug() << "CrossPlatform : " << bCrossPlatform;
}
}
}
}
4——QJsonValue: 是对前面调到的数据类型的包装,C++中针对不同的数据类型有不同的声明,QJsonValue类是利用构造函数将各种数据类型进行了统一化,包装成一种类型,操作更为简单。
QJsonValue 可以封装的基础数据类型有六种:
布尔类型 | QJsonValue::Bool |
浮点类型(包括整形) | QJsonValue::Double |
字符串类型 | QJsonValue::String |
Json 数组类型 | QJsonValue::Array |
Json 对象类型 | QJsonValue::Object |
空值类型 | QJsonValue::Null |
(1)各种类型可以通过 QJsonValue 的构造函数被封装为一个类对象;
(2)如果我们得到一个 QJsonValue 对象,如何判断内部封装的到底是什么类型的数据呢?
// 是否是Json数组
bool isArray() const;
// 是否是Json对象
bool isObject() const;
// 是否是布尔类型
bool isBool() const;
// 是否是浮点类型(整形也是通过该函数判断)
bool isDouble() const;
// 是否是空值类型
bool isNull() const;
// 是否是字符串类型
bool isString() const;
// 是否是未定义类型(无法识别的类型)
bool isUndefined() const;
(3)通过判断函数得到对象内部数据的实际类型之后,如果有需求就可以再次将其转换为对应的基础数据类型。
// 转换为Json数组
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;
// 转换为布尔类型
bool toBool(bool defaultValue = false) const;
// 转换为浮点类型
double toDouble(double defaultValue = 0) const;
// 转换为整形
int toInt(int defaultValue = 0) const;
// 转换为Json对象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;
// 转换为字符串类型
QString toString() const;
QString toString(const QString &defaultValue) const;
- QJsonValue与QVariant互转
QJsonValue fromVariant(const QVariant &variant)
QVariant QJsonValue::toVariant() const
- QJsonValue可以与QJsonObject,QJsonArray互转
QJsonValue::QJsonValue(const QJsonArray &a)
QJsonObject QJsonValue::toObject() const
QJsonValue::QJsonValue(const QJsonObject &o)
QJsonArray QJsonValue::toArray() const