#pragma execution_character_set("utf-8")
#include "widget.h"
#include "ui_widget.h"
#include <QJsonParseError>
#include<QJsonArray>
#include <QJsonValue>
#include <QFile>
#include <QMessageBox>
#include <QDebug>
#include <QJsonObject>
#include <QFileDialog>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
delete ui->treeView->model();
ui->treeView->setModel(&model);
}
Widget::~Widget()
{
delete ui;
}
bool Widget::parseJsonObject(const QString &key, const QJsonObject &obj, QStandardItem *parent)
{
QStandardItem* item = nullptr;
if (parent)
item = setData(parent, key, "[Object]" );
else {
item = new QStandardItem(key);
model.appendRow(item);
auto itm = new QStandardItem("文件名");
model.setItem(item->row(),1, itm);
}
for(auto const& key: obj.keys()){
auto value = obj.value(key);
qDebug()<<"[ Key: "<<key <<" ]";
parseJsonValue(key,value, item);
}
return true;
}
bool Widget::parseJsonArray(const QString &key, const QJsonArray &arr, QStandardItem *parent)
{
QStandardItem* item{nullptr};
item = setData(parent, key, "[Array]" );
if(arr.isEmpty())return false;
int i = 0;
for (auto const& data : arr)
parseJsonValue(QString("属性%1").arg(++i),data,item);
return true;
}
bool Widget::parseJsonValue(const QString &key, const QJsonValue &value, QStandardItem *parent)
{
switch (value.type()) {
case QJsonValue::Bool:
setData(parent, "[Bool]" + key, QString("%1").arg(value.toBool()) );
break;
case QJsonValue::Null:
setData(parent, key, "Null");
break;
case QJsonValue::Double:
setData(parent, key, QString("%1").arg(value.Double));
break;
case QJsonValue::String:
setData(parent, key, value.toString());
break;
case QJsonValue::Object:
parseJsonObject(key,value.toObject(),parent);
break;
case QJsonValue::Array:
parseJsonArray(key,value.toArray(),parent);
break;
default:break;
}
return true;
}
void Widget::saveToJson()
{
}
QStandardItem* Widget::setData(QStandardItem* item, const QString& key,
const QString& value)
{
auto itm = new QStandardItem(key);
item->appendRow(itm);
auto itm2 = new QStandardItem(value);
item->setChild(itm->row(),1, itm2);
return itm;
}
void Widget::on_pushButton_clicked()
{
model.clear();
auto fileName = QFileDialog::getOpenFileName(this, "选择json文件", "", "(*.json);;*.*");
if (fileName.isEmpty())
fileName = "://default.json";
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(this,"出戳了","打开文件错误");
return;
}
model.setColumnCount(2);
model.setHorizontalHeaderLabels(QStringList{ "Key","Type" });
doc=QJsonDocument::fromJson(file.readAll());
auto obj = doc.object();
parseJsonObject(fileName,obj);
ui->treeView->expandAll();
ui->treeView->resizeColumnToContents(0);
}
在这里插入代码#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QJsonDocument>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
#include <QStandardItemModel>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
bool parseJsonObject(const QString& key,const QJsonObject& obj,QStandardItem* parent=nullptr);
bool parseJsonArray(const QString& key,const QJsonArray& arr, QStandardItem* parent=nullptr);
bool parseJsonValue(const QString& key,const QJsonValue& value, QStandardItem* parent);
void saveToJson();
private:
QStandardItem* setData(QStandardItem* item, const QString& key, const QString& value );
private slots:
void on_pushButton_clicked();
private:
QJsonDocument doc;
Ui::Widget *ui;
QStandardItemModel model;
};
#endif
片