参考文献:使用Qt读写JSON文件(二)——从文件解析JSON
代码实现如下:
#include<QDir>
#include<QFile>
#include<QJsonArray>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonParseError>
#include<QJsonValue>
#include<QSysInfo>
#include<QTextStream>
#include<cstdlib>
#include<iostream>
using std::cout;
int main( int argc, char *argv[] ) {
// Qt的一个宏,消除未使用变量的警告,无实际作用
// 定义为,#define Q_UNUSED(x) (void)x
Q_UNUSED( argc );
Q_UNUSED( argv );
// 默认打开的文件位置为用户桌面的test.txt文件。
QFile file("data.json" );
if (!file.open(QIODevice::ReadOnly)) {
cout << "文件打开失败!\n";
exit( 1 );
}
cout << "文件打开成功\n";
QFile f("illuminanceReturn.txt");
f.open( QIODevice::ReadWrite|QIODevice::Append);
QTextStream out(&f);
QJsonParseError jsonParserError;
while(!file.atEnd())
{
QByteArray value=file.readLine();
QJsonDocument jsonDocument=QJsonDocument::fromJson(value,&jsonParserError);
if(!jsonDocument.isNull()&&jsonParserError.error==QJsonParseError::NoError)
{
if(jsonDocument.isObject())
{
QJsonObject jsonObject = jsonDocument.object();
if(jsonObject.contains("actioncode") &&jsonObject.value("actioncode")=="illuminanceReturn")
{
out<<"{\n";
out<<" messageclass:sensorData,"<< "\n";
}
if(jsonObject.contains("postdata")&&jsonObject.value("postdata").isObject())
{
QJsonObject Object=jsonObject.value("postdata").toObject();
if ( Object.contains("sensorDevID")&&
Object.contains("groupID")&&
Object.contains("illuminance")&&
Object.contains("voletage")&&
Object.contains("timestamp")&&
Object.value("sensorDevID").isString()&&
Object.value("groupID").isString()&&
Object.value("illuminance").isString()&&
Object.value("voletage").isDouble()&&
Object.value("timestamp").isString()
)
{
out<<" deviceID:"<<Object.value("sensorDevID").toString()<<"\n";
out<<" typeID:"<<Object.value("groupID").toString()<<'\n';
out<<" illuminance:"<<Object.value("illuminance").toString()<<'\n';
out<<" voletage:"<<Object.value("voletage").toDouble()<<'\n';
out<<" timestamp:"<<Object.value("timestamp").toString()<<'\n';
out<<"}\n";
out<<'\n';
}
}
}
}
}
file.close();
cout << "文件已解析并被保存\n";
return 0;
}