本文参考 : https://www.cnblogs.com/senior-engineer/p/5608985.html
https://blog.csdn.net/hp_cpp/article/details/80338116
https://blog.csdn.net/u011086209/article/details/86073799
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonDocument>
#include <QByteArray>
#include <QString>
#include <QJsonParseError>
#include <QJsonArray>
#include <QFile>
/*
* json : 大括号表示对象, 中括号表示数组
*/
void createJson();
void creatJsonArray();
void creatJsonArray2();
void paserJson();
void WriteFile(QString file,QString json_str);
void paserJsonObject(QString f);
void parseJsonArray(QString f);
void parse(QString f);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// createJson(); //1. 创建一个单独的一个json对象文件
//creatJsonArray(); //2. 创建一个单独的一个json数组文件
//creatJsonArray2(); //创建一个既有json object 和json array组合的对象。
paserJsonObject("F:/dev1.json");
parseJsonArray("F:/dev2.json");
parse("F:/dev3.json");
return a.exec();
}
QByteArray byte_array;
QByteArray byte_array1;
//1. 创建一个单独的一个json对象文件
void createJson()
{
QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
byte_array= document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
qDebug()<<"json_str:"<<json_str;
qDebug()<<"json:"<<json;
WriteFile("F:/dev1.json",json_str);
qDebug()<<"write dev1.json"<<json;
}
//2. 创建一个单独的一个json数组文件
void creatJsonArray()
{
QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);
QJsonDocument document;
document.setArray(json);
byte_array1= document.toJson(QJsonDocument::Compact);
QString json_str(byte_array1);
qDebug()<<"json_str="<<json_str;
WriteFile("F:/dev2.json",json_str);
qDebug()<<"write dev2.json"<<json;
}
//创建一个既有json object 和json array组合的对象。
void creatJsonArray2()
{
QJsonDocument document;
QJsonObject json1; //创建一个json对象
json1.insert("name", QString("Qt"));
QJsonObject json2;
json2.insert("version", 5);
QJsonObject json3;
json3.insert("windows", true);
QJsonArray json;
json.insert(0, json1);
json.insert(1, json2);
json.insert(2, json3);
document.setArray(json); //设置 json array
QJsonObject root;
root.insert("root", json);
document.setObject(root); // json array 添加到json object
byte_array1= document.toJson(QJsonDocument::Compact);
QString json_str(byte_array1);
qDebug()<<"json_str="<<json_str;
WriteFile("F:/dev3.json",json_str); //write file
qDebug()<<"write dev3.json";
}
void parseJsonArray(QString f) //解析dev2.json
{
qDebug()<<"parseJsonArray .....................................";
QFile file(f);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QString value = file.readAll();
file.close();
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i<10;i++)
{
QJsonValue value = array.at(i);
if(value.isString())
{
QString name = value.toString();
qDebug()<<"name="<<name;
}
else if(value.isBool())
{
bool flag = value.toBool();
qDebug()<<"flag="<<flag;
}
}
}
}
}
void paserJsonObject(QString f) //解析dev1.json
{
qDebug()<<"paserJsonObject start.....................................";
QFile file(f);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QString value = file.readAll();
file.close();
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj.take("name");
if(name_value.isString())
{
QString name = name_value.toString();
qDebug()<<"name="<<name;
}
}
if(obj.contains("version"))
{
QJsonValue version_value = obj.take("version");
if(version_value.isDouble())
{
int version = version_value.toVariant().toInt();
qDebug()<<"version="<<version;
}
}
if(obj.contains("windows"))
{
QJsonValue version_value = obj.take("windows");
if(version_value.isBool())
{
bool flag = version_value.toBool();
qDebug()<<"windows="<<flag;
}
}
}
}
}
void WriteFile(QString file,QString json_str)
{
QFile t_file(file); //生成一个文件
if(!t_file.open(QIODevice::WriteOnly/*| QIODevice::Append)*/))
{
qDebug() << "打开文件失败";
}
QTextStream t_stream(&t_file);//文本流关联文件对象
t_stream<<json_str;
t_file.close(); //关闭文件
}
void parse(QString f) // 用于解析dev3.json
{
qDebug()<<"parse dev3.json.....................................";
QFile file(f);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QString value = file.readAll();
file.close();
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("root"))
{
QJsonValue arrayValue = obj.value(QStringLiteral("root"));
if(arrayValue.isArray())
{
QJsonArray array = arrayValue.toArray();
for (int i = 0; i < array.size(); i++)
{
QJsonValue nameArray = array.at(i);
QJsonObject key = nameArray.toObject();
if(key["name"].isString())
{
qDebug() << "key[name]==" << key["name"].toString();
}
else if(key["version"].isDouble())
{
qDebug() << "key[version]==" << key["version"].toInt();
}
else if(key["windows"].isBool())
{
qDebug() << "key[windows]==" << key["windows"].toBool();
}
}
}
}
}
}
}
QString FileHandler::ReadFile(const QString f)
{
qDebug()<<"paserJsonObject start.....................................";
QFile t_file(f);
if(!t_file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << "打开文件失败";
return "false" ;
}
QString value = t_file.readAll();
t_file.close();
return value;
}
void FileHandler::paserComDevFile(QString f) //解析dev4.json
{
QString value=ReadFile(f);
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
if(json_error.error == QJsonParseError::NoError)
{
{
if(parse_doucment.isObject())
{
QJsonObject rootobj= parse_doucment.object();
if(rootobj.contains("root"))
{
QJsonObject subObj = rootobj.value("root").toObject();
qDebug() << " name is:" << subObj["name"].toString();
qDebug() << " windows is:" << subObj["windows"].toString();
qDebug() << " version is:" << subObj["version"].toString();
}}
}
}
else
qDebug()<<"json error:"<<json_error.error;
}
文件dev1.json
{"name":"Qt","version":5,"windows":true}
dev2.json
["Qt","version",true]
dev3.json
{"root":[{"name":"Qt"},{"version":5},{"windows":true}]}
dev4.json
{
"root":{
"name":"Qt",
"windows":"true",
"version":"5"
}
}
最后总结:
首先区分是jsonArray 或者是jisonObject.
因为object 遵循的是 key,value 这样的键值对。那么解析object的时候
可以有两种方法:
{
"root":{"name":"Qt",“version”,"1.0"}
}
方法1:
if(root.contains("name"))
{
QJsonvalue name_value=rootobj.take("name");
qDebug()<<"name_value"<<name_value.toString();
}
方法2:见解析dev4.json key[name]