Qt5中提供了很方便的用于解析Json数据的类,主要包括QJsonValue,QJsonArray,QJsonObject,QJsonDocument等。使用这几个类能够很轻易在C++端创建和处理Json格式的数据,或对Json数据进行序列化及反序列化等。
QJsonValue类是用于保存所有类型的Json数据,它将Json数据归为下列6种基本类型:
bool QJsonValue::Bool
double QJsonValue::Double
string QJsonValue::String
array QJsonValue::Array
object QJsonValue::Object
null QJsonValue::Null
通过参数设置Json文件的路径然后通过调用接口进行数据解析:
void Utils::initCourseWareInfos(const QString &path)
{
QString val;
QFile file;
file.setFileName(path);
//打开json文件
if (!(file.open(QIODevice::ReadOnly | QIODevice::Text))) return;
val = file.readAll();
file.close();
m_courseWareInfos.clear();
QJsonParseError error;
QJsonDocument message = QJsonDocument::fromJson(val.toUtf8(), &error);
if (error.error || !message.isObject()) {
return;
}
QJsonObject sett2 = message.object();
QJsonValue value = sett2.value(QString("courseWareData"));//根据文件内容节点进行一层一层解析
QJsonObject item = value.toObject();
QJsonValue gradeInfo = item.value(QString("gradeInfo"));
QJsonArray gradeArray = gradeInfo.toArray();//获取某个节点下数组内容
for (int i = 0; i < gradeArray.count(); ++i){
CourseWareInfos cwInfos;
QJsonObject tempobj = gradeArray[i].toObject();
cwInfos.name = tempobj.value("name").toString();//拿到某一个具体属性的值并初始化相关业务的数据结构
cwInfos.index = tempobj.value("index").toInt();
QJsonArray tempArray = tempobj.value("data").toArray();
for (int j = 0; j < tempArray.count(); ++j){
QJsonObject temp = tempArray[j].toObject();
LectureData ltdata;
ltdata.id = temp.value("id").toInt();
ltdata.lectureName = temp.value("name").toString();
QJsonArray paragraphArray = temp.value("lecture").toArray();
for (int k = 0; k < paragraphArray.count(); ++k){
ParagraphInfos pginfo;
QJsonObject ptemp = paragraphArray[k].toObject();
pginfo.index = ptemp.value("index").toInt();
pginfo.AudioUrl = ptemp.value("AudioUrl").toString();
pginfo.ContentUrl = ptemp.value("ContentUrl").toString();
ltdata.paragraphInfos.append(pginfo);
}
cwInfos.lectureData.append(ltdata);
}
m_courseWareInfos.append(cwInfos);//存储所有解析好的json文件中的内容
}
}