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

Qt 操作Json格式文件(创建、插入、解析、修改、删除)_qjsonobject 打开 追加 “serialOne”: { “language”: “汉语”, “grade”: 10 },* “serialTwo”: { “language”: “英语”, “grade”: 6 }// 设置读取编码是UTF8。* { “game”: “海岛奇兵”, “price”: 66.65 }* { “game”: “三国杀”, “price”: 58.5 },language1.insert(“language”, “汉语”);likeObject1.insert(“game”, “三国杀”); 阅读详情
AI摘要

本文介绍了一个使用Qt库解析JSON文件的实例,展示了如何从本地文件加载JSON数据,并通过QJson库解析不同类型的JSON元素,包括对象和数组。

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();
            }
        }
    }
2024年最全Qt5 利用QJson从文件读取Json并解析_qt5 qjson解析map,物联网嵌入式开发从入门到精通 【代码】2024年最全Qt5 利用QJson从文件读取Json并解析_qt5 qjson解析map,物联网嵌入式开发从入门到精通。 阅读详情

相关推荐

2024年Qt5 利用QJson从文件读取Json并解析_qt5 qjson解析map(1),C C++程序员架构之路该如何继续学习

提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

2401_84973706的博客 855

【Qt】Json解析

它是一种轻量级的、开放的、易于阅读和理解的数据格式,适用于广泛的应用场景。正是由于Json格式的数据的常用性,所以很多时候我们使用Qt框架来写程序是绕不开它的。而Qt自然也有专门的类用来读写Json格式的数据。

卡钦斯基的博客 4292

【QT】Qt使用QJson生成json文件并保存

Qt使用QJson生成json文件并保存

Cappuccino Blog 5042

QT中QJson详细解析+代码演示

QT中数据的封包和解析非常重要,下面我就总结了一些资料分享给大家。

weixin_46068274的博客 1万+

Qt读取JSON和XML数据

QJSON JSON(JavaScript Object Notation)是一个轻量级的数据交换格式; 可以将数据以name/value的形式任意组合; QJson 是一个基于Qt的库, 将JSON的数据map成name-QVariant的形式, 或者进行反相转换; 通过Q_PROPERTY还可以转换QObject类中的数据; QJSON Source http://qjson

Fix it 3489

QT之QJson传输和中文乱码解决方案

QT之QJson传输和中文乱码解决方案本文对遇到QJson的解析和传输遇到的些问题作出一些解决的办法 qt中传输json数据 qt接收json数据中包含中文转换 qt传输json数据Qt5中JSON的生成与解析QJsonDocumentQJsonDocument既可以从一个基于文本表示的UTF-8编码,又可以从Qt自己的二进制格式读取和写入这个文件。 JSON文档可以从它的基于文本的表示使用QJso

渐渐的不归路专栏 2万+

Qt工作笔记-Qt5 利用QJson从文件读取Json并解析

原文地址: https://blog.youkuaiyun.com/hp_cpp/article/details/80338116   Json文件是这样: { "first fruit": { "describe":"an apple", "icon":"appleIcon", "name":"apple"

IT1995的博客 7194

Qt Json解析详解

Json(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

程序猿老樊的博客 926

2024年Qt5 利用QJson从文件读取Json并解析_qt5 qjson解析map,2024年最新74道高级C C++面试合集

【代码】2024年Qt5 利用QJson从文件读取Json并解析_qt5 qjson解析map,2024年最新74道高级C C++面试合集。

2401_84973706的博客 523

Qt基础篇:Qt生成与解析修改JSON文件

简述 Qt5 中包含了处理 JSON 的类,均以 QJson 开头(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模块中,不需要额外引入其它模块。 效果: 代码如下: #include <QCoreApplication> #include <QJsonArray> #include <QJsonDocument> #include <QJsonObject> #include <QJsonPars

欧特GO 4640

Qt 之 JSON 生成与解析

Qt 中包含了处理 JSON 的类,均以 QJson 开头(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模块中,不需要额外引入其它模块。

青春不老,奋斗不止! 4万+

Qt读写JSON,以及使用QTreeView展示和编辑JSON数据

0.前言 JSON(JavaScriptObjectNotation)是一种轻量级的结构化数据格式,相对于XML语法更简洁。它具有6种基本数据类型:bool(true或false字符串表示)、double(对应JS中number)、string、array(值的列表)、object(键值对集合)、null 。 虽然cJSON和JsonCpp也是常用的C/C++ JSON解析器,但是在Q...

龚建波 1万+

信号削峰CFR基础知识介绍(一)

接下来,将得到的峰值分成若干段,在每一段中,仅保留该段内所有峰值中幅度最大的峰值。为了减少不必要的带外泄露,削峰后的信号将通过一个低通滤波器,以减少对应于削峰后信号中尖锐拐角的高频信号。首先,它识别出高于由目标PAPR确定的阈值的峰值。在峰值加窗算法中,削峰是通过在峰值区域将原始信号与一个加窗函数相乘来实现的,如下图所示。其中,w(n) 是一种常见的加窗函数,如凯撒窗、高斯窗和汉明窗等,而 p(n) 是一个加权系数。如上图所示,削峰会导致削峰后的信号出现尖锐的拐角,从而引发不必要的带外辐射(ACP增加)。

weixin_49761275的博客 1549

Qt之JSON生成与解析

简述 Qt5 中包含了处理 JSON 的类,均以 QJson 开头(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模块中,不需要额外引入其它模块。 简述 常用的 JSON 库 JSON 常用类 简单的 JSON 对象 简单的 JSON 数组 复杂的 JSON 更多参考 ...

weixin_34104341的博客 6502

游程理论提取灾害事件特征V2---基于MATLAB语言的编程实现

游程理论,灾害事件,MATLAB

EWBA_GIS_RS_ER的博客 3792

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5410

Qt平台下使用QJson解析和构建JSON字符串

前言 上一篇介绍了C语言写的JSON解析库cJSON的使用:使用cJSON库解析和构建JSON字符串 本篇文章介绍,Qt开发环境下QJson库的使用示例,JSON解析配合API接口,就可以实现一些有趣的工具了,如全国油价查询工具,全国天气查询,空气质量查询,黄历查询,生活指数等等实用工具的开发。 分享几个免费的API提供平台: K780:http://www.k780.com/api 天气API...

whik1194的博客 2072

Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧

本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。

k8l9m0n的博客 714

Qt使用QJson生成json文件并保存

#include <QJsonDocument> #include <QJsonParseError> #include <QFile> #include <QJsonObject> #include <QDebug> #include <QJsonArray> #include <QByteArray> vo...

-却道天凉好个秋的博客 7270

宇树智能人形机器人模块化腿部动力系统技术拆解

o电机防摔防护板(3.1.5.1)→端盖总成(3.1.5.2)→电机外壳(3.1.5.4)的冲击力传递路径;o散热风扇(3.1.3.1)推动冷风→大腿基座腔体→散热片组(3.1.5.7)→中空大腿杆排出;o防御专利:覆盖“关节热管理风道接口标准”、“抗冲击结构身份编码”;o大腿杆腔体(3.1.3.4)内置反平行四边形机构,避免连杆外露。:力传感器(3.1.8.4.2)仅部署于足端,缺失关节力矩反馈。:更换行星减速器(3.1.5.5)需拆解整个电机模块;o热量传导路径:电机定子→外壳→散热片组。

weixin_50955533的博客 1230

信道估计准则演进:从LS、MMSE到LMMSE的工程权衡

本文深入探讨了信道估计准则的演进历程,从LS、MMSE到LMMSE的工程权衡。通过对比分析三大经典算法的数学本质、工程实现及适用场景,揭示了在计算复杂度、实时性和性能之间的关键取舍。文章结合4G/5G基站项目实战经验,提供了算法选型的三维决策模型和前沿发展建议,为无线通信系统设计提供实用指导。

weixin_29327525的博客 279

QJson的生成和解析

Qt之JSON生成与解析 简述 Qt5 中包含了处理 JSON 的类,均以 QJson 开头(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模块中,不需要额外引入其它模块。 简述 常用的 JSON 库 JSON 常用类 简单的 JSON 对象 简单的 JSON 数组 复杂的 JSON 更多参考 常用的 JSON 库...

foxgod的专栏 2万+

NSGA(非支配排序遗传算法)

在多目标优化问题中,往往存在多个相互冲突的目标需要同时优化。传统的单目标优化算法无法直接应用于这类问题,因此需要专门的多目标优化算法。非支配排序遗传算法(Non-dominated Sorting Genetic Algorithm,NSGA)是一种经典的多目标优化算法,由印度科学家 Kalyanmoy Deb 等人于 1995 年提出。NSGA 通过非支配排序和拥挤度距离来引导种群向 Pareto 最优前沿进化,从而得到一组具有良好分布性和收敛性的 Pareto 最优解。

2969

QJSON的使用介绍之读篇

上一页:QJSON的使用介绍之写篇 简介 读Json除会用到写时需要的类,还需要QJsonParseError用于在将文件数据转换为Json格式数据时的错误接收。本章例子,将前面写到文件中的json读取到QJson中。 为了多次读方便,封装一个通用的读JSON函数,提供给下面的例子使用: /** * outDoc: 保存解析结果。 * fileName: 要解析的json文件名称 * return: 成功:true, 失败: false */ bool readFile(QJson

guoqignrus的博客 3344

PCL 点云配准-ICP算法(精配准)

ICP(Iterative Closest Point)算法是一种常用的点云精细配准算法。它通过迭代计算将一组点云变换到另一组点云的最佳位置,最终实现精确的对齐。ICP算法在每次迭代中选择与目标点云最接近的点作为对应点,通过计算最小化源点云和目标点云之间的均方误差(MSE)来进行刚性变换(包括平移和旋转)。

纵马踏花向自由 1724

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: QT中解决QPixmap加载大图片报错的问题(错误指示到QPMCache::releaseKey函数第一行)
下一篇: 巧记标志寄存器在Debug中的表示
hp_cpp
博客等级 码龄11年 310粉丝 218原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值