Qt5 利用QJson从文件读取Json并解析

2 篇文章 0 订阅

Json文件是这样:

{
	"first fruit":
	{
		"describe":"an apple",
		"icon":"appleIcon",
		"name":"apple"
	},
	"second fruit":
	{
		"describe":"an orange",
		"icon":"orangeIcon",
		"name":"orange"
	},
	"three fruit array":
	[
		"eat 0",
		"eat 1",
		"eat 2",
		"eat 3",
		"eat 4"
	]
}

存放在本地磁盘。
利用QJson可以方便的进行解析。

   QFile loadFile("D:\\1.json");

    if(!loadFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "could't open projects json";
        return;
    }

    QByteArray allData = loadFile.readAll();
    loadFile.close();

    QJsonParseError jsonError;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &jsonError));

    if(jsonError.error != QJsonParseError::NoError)
    {
        qDebug() << "json error!" << jsonError.errorString();
        return;
    }

    QJsonObject rootObj = jsonDoc.object();

    QStringList keys = rootObj.keys();
    for(int i = 0; i < keys.size(); i++)
    {
        qDebug() << "key" << i << " is:" << keys.at(i);
    }

    //因为是预先定义好的JSON数据格式,所以这里可以这样读取
    if(rootObj.contains("first fruit"))
    {
       QJsonObject subObj = rootObj.value("first fruit").toObject();
       qDebug() << "describe is:" << subObj["describe"].toString();
       qDebug() << "icon is:" << subObj["icon"].toString();
       qDebug() << "name is:" << subObj["name"].toString();
    }

    if(rootObj.contains("second fruit"))
    {
       QJsonObject subObj = rootObj.value("second fruit").toObject();
       qDebug() << "describe is:" << subObj.value("describe").toString();
       qDebug() << "icon is:" << subObj.value("icon").toString();
       qDebug() << "name is:" << subObj.value("name").toString();
    }

    if(rootObj.contains("three fruit array"))
    {
       QJsonArray subArray = rootObj.value("three fruit array").toArray();
       for(int i = 0; i< subArray.size(); i++)
       {
           qDebug() << i<<" value is:" << subArray.at(i).toString();
       }
    }

需要包含的头文件:

#include <QJsonDocument>
#include <QJsonParseError>
#include <QFile>
#include <QJsonObject>
#include <QDebug>
#include <QJsonArray>

运行结果:

key 0  is: "first fruit"
key 1  is: "second fruit"
key 2  is: "three fruit array"
describe is: "an apple"
icon is: "appleIcon"
name is: "apple"
describe is: "an orange"
icon is: "orangeIcon"
name is: "orange"
0  value is: "eat 0"
1  value is: "eat 1"
2  value is: "eat 2"
3  value is: "eat 3"
4  value is: "eat 4"

Qt官方文档JSON Save Game Example
也可以看:JSON实战之savegame(Qt Example)

每次读取之前,都要判断

 void Character::read(const QJsonObject &json)
  {
      if (json.contains("name") && json["name"].isString())
          mName = json["name"].toString();

      if (json.contains("level") && json["level"].isDouble())
          mLevel = json["level"].toInt();

      if (json.contains("classType") && json["classType"].isDouble())
          mClassType = ClassType(json["classType"].toInt());
  }

先用contains判断是否存在,再用isString判断是能转换。

bool isArray() const
bool isBool() const
bool isDouble() const
bool isNull() const
bool isObject() const
bool isString() const
bool isUndefined() const

修改后的代码为:

	QFile loadFile("D:\\1.json");

    if(!loadFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "could't open projects json";
        return;
    }

    QByteArray allData = loadFile.readAll();
    loadFile.close();

    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error));

    if(json_error.error != QJsonParseError::NoError)
    {
        qDebug() << "json error!";
        return;
    }

    QJsonObject rootObj = jsonDoc.object();

    QStringList keys = rootObj.keys();
    for(int i = 0; i < keys.size(); i++)
    {
        qDebug() << "key" << i << " is:" << keys.at(i);
    }

    //因为是预先定义好的JSON数据格式,所以这里可以这样读取
    if(rootObj.contains("first fruit") && rootObj["first fruit"].isObject())
    {
        QJsonObject subObj = rootObj["first fruit"].toObject();
        if (subObj.contains("describe") && subObj["describe"].isString())
        {
            qDebug() << "describe is:" << subObj["describe"].toString();
        }
        if (subObj.contains("icon") && subObj["icon"].isString())
        {
            qDebug() << "icon is:" << subObj["icon"].toString();
        }
        if (subObj.contains("name") && subObj["name"].isString())
        {
            qDebug() << "name is:" << subObj["name"].toString();
        }
    }

    if(rootObj.contains("second fruit") && rootObj["second fruit"].isObject())
    {
        QJsonObject subObj = rootObj["second fruit"].toObject();
        if (subObj.contains("describe") && subObj["describe"].isString())
        {
            qDebug() << "describe is:" << subObj["describe"].toString();
        }
        if (subObj.contains("icon") && subObj["icon"].isString())
        {
            qDebug() << "icon is:" << subObj["icon"].toString();
        }
        if (subObj.contains("name") && subObj["name"].isString())
        {
            qDebug() << "name is:" << subObj["name"].toString();
        }
    }

    if(rootObj.contains("three fruit array") && rootObj["three fruit array"].isArray())
    {
        QJsonArray subArray = rootObj.value("three fruit array").toArray();
        for(int i = 0; i< subArray.size(); i++)
        {
            if (subArray[i].isString())
            {
                qDebug() << i<<" value is:" << subArray.at(i).toString();
            }
        }
    }
  • 35
    点赞
  • 163
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
款已经超过额度,请尽快还款。 | 垃圾 | | 你好,您的快递已经在Qt中读取解析JSON文件可以使用Qt自带的QJsonDocument类和QJsonObject类。下面是一个到达,请尽快领取。 | 正常 | | 您好,恭喜您获得iPhone手机一台,请点击简单的例子: ```c++ // 读取JSON文件 QString jsonFilePath = "path/to/json/file.json"; QFile链接领取。 | 垃圾 | | 你好,我们公司正在招聘前端设计师,请尽快申请。 jsonFile(jsonFilePath); if (!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open | 正常 | | 你好,我们公司正在招聘后端设计师,请尽快申请。 | 正常 JSON file:" << jsonFilePath; return; } // 解析JSON文本 QJsonParseError parseError; QJsonDocument json | | 你好,我们公司正在招聘UI设计师,请尽快申请。 | 正常 | | 您好,Doc = QJsonDocument::fromJson(jsonFile.readAll(), &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "Failed to parse JSON file:" << parseError.errorString(); return; } // 获取JSON对象 Q您的信用卡已经欠款10万元,请尽快还款。 | 垃圾 | | 你好,您的JsonObject jsonObj = jsonDoc.object(); // 获取JSON中的数据 QString name = jsonObj["name"].toString(); int age = jsonObj["age快递已经到达,请查收。 | 正常 | | 您好,恭喜您获得iPhone手机一台,请"].toInt(); bool married = jsonObj["married"].toBool(); ``` 在这个例子中,我们首先打开JSON文件回电确认。 | 垃圾 | | 你好,我们公司正在招聘大数据设计师,请尽快申请。,然后使用`QJsonDocument::fromJson()`函数将JSON文本解析为`QJsonDocument`对象。如果解析 | 正常 | | 你好,我们公司正在招聘人工智能设计师,请尽快申请。 |失败,我们可以使用`QJsonParseError`类获取错误信息。 接着,我们可以使用`QJsonDocument::object()`函数获取JSON对象,并使用`[]`运算符获取其中的数据。需要注意的是,如果JSON中的数据类型与 正常 | | 你好,我们公司正在招聘机器学习设计师,请尽快申请。 | 正常我们获取的类型不匹配,会发生运行时错误。因此,在实际应用中,我们应该先 | | 您好,您的信用卡欠款已经超过额度,请尽快还款。 | 垃圾 | 检查JSON数据的类型再进行转换。 希望这个例子能够帮助你理解如何在Qt中读取解析JSON文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值