Qt 中解析JSON

#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 = new QStandardItem(key);
    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:
		//parent->appendRow(new QStandardItem(QString("[Bool] %1").arg(value.toBool())));
        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);
	//itm->setData(key, Qt::UserRole);
	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 // WIDGET_H
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值