介绍:负责封装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() ;
- QJsonArray pArry = eObj[JSONKEY::PROGRAM_JSONKEY].toArray();
- for(int i=0; i<pArry.size();i++)
- {
- QJsonObject eObject = pArry.at(i).toObject();
- for(int i = 0; i < addrArray.size(); i++)
- {
- eObject.insert(QString::number(addrArray.at(i).toInt()),QJsonValue(chValueArray));
- }
- pArry.replace(i,eObject);
- }
- eObj[JSONKEY::PROGRAM_JSONKEY] = pArry;
- 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 fromVariant(const QVariant &variant)
- QVariant QJsonValue::toVariant() const
- QJsonValue::QJsonValue(const QJsonArray &a)
- QJsonObject QJsonValue::toObject() const
- QJsonValue::QJsonValue(const QJsonObject &o)
- QJsonArray QJsonValue::toArray() const