当前位置: 首页 > news >正文

广州软件园 网站建设jquery 开发网站

广州软件园 网站建设,jquery 开发网站,大专建设工程管理有用吗,中国网站建设新闻目录 一.JSON简介 JSON对象 JSON数组 二.Qt中JSON介绍 QJsonvalue Qt中JSON对象 Qt中JSON数组 QJsonDocument 三.Qt构建JSON数组 四.解析JSON数组 一.JSON简介 一般来讲C类和对象在java中是无法直接直接使用的#xff0c;因为压根就不是一个规则。但是他们在内存中…目录 一.JSON简介 JSON对象 JSON数组 二.Qt中JSON介绍  QJsonvalue Qt中JSON对象 Qt中JSON数组  QJsonDocument 三.Qt构建JSON数组 四.解析JSON数组 一.JSON简介 一般来讲C类和对象在java中是无法直接直接使用的因为压根就不是一个规则。但是他们在内存中都是二进制表示的所以把C的类和对象转成二进制再按照java的规则解析这段二进制代码就可以做到C描述的东西在java中复现了。但是呢涉及到底层的东西都非常复杂直接解析二进制非常困难所以JSON应运而生JSON是一种文本格式文本格式相对来说比较接近人类语言规则便于理解同时能够将复杂的数据结构如对象和数组转换为一种通用的表示形式使得不同语言之间的数据交换变得可行简化了各种语言数据之间的转换解析。JSON的作用可以通俗地举个例子比如我有一个俄罗斯朋友他不会中文我不会俄文所以我们之间写信既不能用中文也不能用俄文。但是我们都会英文所以我可以把原先写好的中文信按照中文翻译成英文的规则翻译成英文他接收到信件后可以按照英文翻译成俄文的规则进行解析阅读。所以JSON就是个桥梁中间过渡作用便于不同语言之间数据的传输和交换。 JSON全称JavaScript Object NotationJSON的名称中包含“JavaScript”这表明它最初是为JavaScript设计的。JSON的语法是基于JavaScript的对象字面量表示法因此它与JavaScript的结构非常相似但是现在基本上和js没什么太大的关系了规则早就独立出来了基本上所有语言都支持JSON格式的构建和解析不是js一家独有。 二.JSON格式 先来举个简单的例子 JSON一般来讲就JSON对象和JSON数组两种格式 JSON对象 JSON对象一般是以花括号包起来的 {  }里面成员都是键值对的形式。键必须是字符串类型值可以是各种别的类型也可以再嵌套一层JSON对象或者JSON数组。 JSON数组 JSON数组一般是以中括号包起来的[ ]里面的成员可以是各种不同的类型包括整型、浮点型、字符串、布尔类型、JSON数组、JSON对象 举个例子 { name: Alice, age: 30, isStudent: false, courses: [ { courseName: Mathematics, credits: 3, instructor: { name: Dr. Smith, email: smithexample.com } }, { courseName: Physics, credits: 4, instructor: { name: Dr. Johnson, email: johnsonexample.com } } ] } 首先上面例子中整体是一个JSON对象因为最外层是花括号JSON对象只能是键值对这个JSON键值对有4个键分别为name、age、isStudent、coursescourses的值为JSON数组类型这个数组类型包了两个JSON对象其中键为courseName、credits、instructor,而instructor又是一个JSON对象键为name和email 二.Qt中JSON介绍  QJsonvalue QJsonValue 是一个可以持有多种JSON数据类型的值如对象、数组、字符串、数字、布尔值和空值的容器。这种设计使得 QJsonObject 和 QJsonArray 能够以统一的方式处理这些不同类型的值而不需要为每个可能的类型提供单独的接口。 常见的成员函数 构造函数 QJonvalue支持多种类型构造包括null空值构造例子里的最后一个所以在JSON对象和JSON的成员函数里如果有用到QJonvalue的是可以直接填自己常用的类型直接隐式类型转换的 判断内部封装是什么类型的函数 类型转换 Qt中JSON对象 Qt中用Qobject类来表示JSON对象 常见的成员函数如下 大部分成员函数都与C的容器类差不多 构造函数及拷贝构造 赋值  迭代器 查找 一般都只会用到第一个QString类型的key值去查找 插入 与容器插入也类似如果插入的键key原本就存在那么它的值会自动覆盖。如果是插入新的键值对会直接插入到对象中但是是无序插入不一定新的键值对就在对象的最末尾。Qt中没给指定迭代器insert插入 删除 删除有两种方式迭代器删除或者直接给键的名称remove删除 重载方括号 此处的重载方括号是便于根据键去找值所以方括号里面填的不是数组下标而是键的名称 通过key值得到value 遍历key 这个是获取所有键名称的得到的键名称会直接放到QStringList中与上面的通过key值得到value配合就可以知道所以键值对的情况了 举个打印键值对的例子 Qt中JSON数组  Qt中用QJsonArray类来表示JSON数组内部类型都为QJsonvalue 常见的成员函数 构造及拷贝构造 添加插入数组元素 追加的形式添加元素 尾插及头部插入 insert指定位置插入 获取元素值 获取头部的值 获取尾部的元素值 获取指定位置的值 删除元素 头删尾删 删除指定位置元素 QJsonDocument QJsonDocument封装了一个完整的JSON文档可以从utf-8编码的基于文本的表示以及Qt本身的二进制格式读取和写入该文档 前面的QJsonObject对象和QJsonArray可以当作QJsonDocument的一部分不过整体处理还是通过QJsonDocument来进行处理的。使用 QJsonDocument::fromJson 方法解析 JSON 字符串或文件时它会根据 JSON 数据的内容是对象还是数组来决定返回一个包含 QJsonObject 还是 QJsonArray 的 QJsonDocument 实例。然后你可以检查返回的 QJsonDocument 是否包含对象或数组并相应地将其转换为 QJsonObject 或 QJsonArray 进行进一步处理。构建JSON文件时也是对QJsonDocument对象进行转换 成员函数 构造函数可以通过JSON对象或者JSON数组直接构造 构建JSON字符串常用的函数 将QJsonDocument转成JSON字符串或者二进栈字符串 第一个是二进栈文件第二、三都是转成JSON文件 解析JSON文件常用的函数 解析JSON文件一般分为两步第一步是将JSON文件转换成QJsonDocument 第一种是从二进制数据的文档中解析JSON字符串QJsonDocument::DataValidation validation可选指定数据验证的级别。默认是 QJsonDocument::Validate意味着会进行完整的验证这个一般都是自动补齐的一般都用不到直接用默认的就可以了。 第二种是从JSON格式的文本文件中解析JSON字符串QJsonParseError *error可选指向 QJsonParseError 对象的指针用于在解析过程中捕获错误信息这个也是直接用就可以了 第二步是将QJsonDocument文件具体解析成具体的 QJsonArray 或者 QJsonObject 与之相关的是先判断是数组还是对象然后才能具体解析 最后将 QJsonDocument具体转换成 QJsonArray 或者 QJsonObject 三.Qt构建JSON数组 { name: Alice, age: 30, isStudent: false, courses: [ { courseName: Mathematics, credits: 3, instructor: { name: Dr. Smith, email: smithexample.com } }, { courseName: Physics, credits: 4, instructor: { name: Dr. Johnson, email: johnsonexample.com } } ] } 怎么将上面的JSON语句用Qt构建出来呢可以利用JSON解析工具来理清结构JSON 在线解析、格式化、校验工具 (jsontool.cn) 正常未折叠是这样的 然后从上图可以看出来最外围是个对象所以直接先构建一个QJsonObject对象出来 可以直接实例化也可以new对象出来但是new出来一定要在最后释放掉 接着要处理JsonObject里面的东西了但是因为有很多嵌套其实不好看清结构的所以可以借助在线解析工具将一些暂时用不到的结构折叠起来 从上图可以看出来 JsonObject第二层有nameageisStudentcourses四个东西其中courses的值是QJsonArray 类型可以要晚点处理不能直接插入但是剩余的三个都是正常的键值对所以直接插入 JsonObject里就可以了 而对courses的处理先构造出 QJsonArray 空数组出来然后再一步步往里面插东西 展开courses可以看出来里面是两个QJsonObject类型的Json对象 先处理第一个Object对象也是先实例化出来 然后展开第一个Object看看里面的样子 从上图可以看出来前两个直接插入就可以了而第三个成员又嵌套了一个Object对象所以也得特殊处理当instructor全部处理完了才能插入courses1中 courses2的操作与courses1操作类似所以就不多加赘述了 courses2处理完了就代表array处理完了所以进行下一步插入操作了 完整代码如下 QJsonObject* JsonObjectnew QJsonObject();JsonObject-insert(name,Alice);JsonObject-insert(age,30);JsonObject-insert(isStudent,false);//courses数组处理QJsonArray array;//courses数组中第一个对象QJsonObject courses1;courses1.insert(courseName,Mathematics);courses1.insert(credits,3);QJsonObject instructor; //courses1这个对象里面又嵌套了对象所以也得特殊处理instructor.insert(name,Dr. Smith);instructor.insert(email,smithexample.com);courses1.insert(instructor,instructor);//处理完了进行插入//courses数组中第二个对象QJsonObject courses2;courses2.insert(courseName,Physics);courses2.insert(credits,4);QJsonObject instructor2;instructor2.insert(name,Dr. Johnson);instructor2.insert(email,johnsonexample.com);courses2.insert(instructor,instructor2);array.push_back(courses1);//JsonArrary数组插入数据array.push_back(courses2);JsonObject-insert(courses,array);//array里面的成员全部处理完了插入最外层对象// 当不再需要 JsonObject 时使用 delete 删除它 delete JsonObject; 构建完了后转换成QJsonDocument然后转换成JSON格式打印一下看看内容 最后直接保存到文件里  四.解析JSON数组 一种解析方法是递归进行处理不过打印出来是无序的因为JSON对象本来就是无序的。不过因为太复杂了而且容易出问题如果是直接JSON文件是可以打开看到基本的JSON结构的而从API接收数据一般会给一个JSON格式案例的所以直接对照案例解析就可以了递归是在完全不知道要解析JSON文件的格式的情况下才选择的 // 递归处理 JSON 数据 void parseJsonValue(const QJsonValue value) {if (value.isObject()) {// 如果是对象直接打印键值对QJsonObject obj value.toObject();for (QString key : obj.keys()) {QJsonValue val obj.value(key);// 直接打印键值对if (val.isBool()) {qDebug() key : val.toBool();} else if (val.isDouble()) {qDebug() key : val.toDouble();} else if (val.isString()) {qDebug() key : val.toString();} else if (val.isNull()) {qDebug() key : null;} else if (val.isObject() || val.isArray()) {qDebug() key : [Complex Type];// 对于嵌套的对象或数组继续递归parseJsonValue(val);}}} else if (value.isArray()) {// 如果是数组遍历数组中的所有元素QJsonArray array value.toArray();for (int i 0; i array.size(); i) {qDebug() Array index i :;parseJsonValue(array[i]); // 递归解析数组的元素}} else if (value.isBool()) {qDebug() Bool: value.toBool();} else if (value.isDouble()) {qDebug() Double: value.toDouble();} else if (value.isString()) {qDebug() String: value.toString();} else if (value.isNull()) {qDebug() Null;} else {qDebug() Unknown type;} } Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this);QFile file(E:/Qt/q/content/untitled15/teacher.json);if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() Could not open file;}QByteArray fileData file.readAll();QJsonDocument doc QJsonDocument::fromJson(fileData);if (!doc.isNull()) {if (doc.isObject()) {parseJsonValue(doc.object());} else if (doc.isArray()) {parseJsonValue(doc.array());} else {qDebug() Document is not an object or array;}} else {qDebug() Invalid JSON data;}}如果已经知道了格式该怎么解析 还是老演员例子 直接按图索骥直接用键打印值就行 #include widget.h #include ui_widget.h #include QJsonArray #include QJsonObject #include QJsonDocument #include QDebug #include QFile #include QStringList// Widget类的构造函数 Widget::Widget(QWidget *parent): QWidget(parent) // 调用基类的构造函数, ui(new Ui::Widget) // 初始化UI界面 {ui-setupUi(this); // 设置UI界面// 打开JSON文件QFile file(E:/Qt/q/content/untitled15/teacher.json);if (!file.open(QFile::ReadOnly)) { // 如果文件打开失败qDebug() Could not open file; // 打印错误信息return; // 退出构造函数}QByteArray Bit file.readAll(); // 读取文件内容到QByteArrayQJsonDocument doc QJsonDocument::fromJson(Bit); // 将QByteArray解析为QJsonDocumentif (doc.isObject()) { // 检查最外层是否是JSON对象QJsonObject object doc.object(); // 获取JSON对象// 直接处理JSON对象中的每个字段if (object.contains(age) object[age].isString()) {qDebug() age: object[age].toString(); // 打印年龄}if (object.contains(isStudent) object[isStudent].isString()) {qDebug() isStudent: object[isStudent].toString();}if (object.contains(name) object[name].isString()) {qDebug() name: object[name].toString(); // 打印姓名}// 处理courses数组if (object.contains(courses) object[courses].isArray()) {QJsonArray courses object[courses].toArray(); // 获取courses数组for (int i 0; i courses.size(); i) { // 遍历courses数组QJsonObject course courses[i].toObject(); // 获取当前课程对象if (course.contains(courseName) course[courseName].isString()) {qDebug() Course Name: course[courseName].toString(); // 打印课程名称}if (course.contains(credits) course[credits].isDouble()) {qDebug() Credits: course[credits].toDouble(); // 打印学分}if (course.contains(instructor) course[instructor].isObject()) {QJsonObject instructor course[instructor].toObject(); // 获取讲师对象if (instructor.contains(name) instructor[name].isString()) {qDebug() Instructor Name: instructor[name].toString(); // 打印讲师姓名}if (instructor.contains(email) instructor[email].isString()) {qDebug() Instructor Email: instructor[email].toString(); // 打印讲师邮箱}}}}} else {qDebug() JSON root is not an object; // 如果最外层不是对象则打印错误信息} }// Widget类的析构函数 Widget::~Widget() {delete ui; // 清理UI资源 }
http://www.hkea.cn/news/14351861/

相关文章:

  • 网站建站网站山东广饶县建设局网站
  • 百度站长推送欧美化妆品网站模板下载
  • wordpress建站dedecms站长论坛 激活网站
  • 做超市促销海报哪个网站好凡科手机网站建设
  • 网站弄论坛形式怎么做建设银行苏州网站
  • 建设校园标准信息服务网站论文东营房产信息网58同城
  • 交流网站模版婚纱网站有哪些
  • 重庆自助模板建站行业网站策划
  • 网站风格有哪些淮北建网站费用
  • 做名片网站短期网站建设培训班
  • 莱州网站建设政法队伍建设网站主要内容
  • 网站建设宣传视频2022麻豆区区区三区四区
  • 安仁做网站东莞长安网站优化公司
  • 收费图片网站不买服务器做网站
  • 建立网站要钱吗企业做网站系统
  • 惠州品牌网站建设价格品牌网图片新闻2003年下一条文章
  • 怎样用自己的主机做网站wordpress调用用户头像
  • 苏州做网站设计的公司网站建设比较好的
  • 网站快照查询sem专员
  • 邵阳优秀网站建设线在科技成都网站推广公司
  • 网站设计制作报告平面设计专业学校排名
  • server 2008 iis 部署网站地方门户源码
  • 为什么公司网站打不开环球新军事最新消息
  • 六安市裕安区建设局网站下载wordpress 4.8.1
  • seo需要会网站建设吗网站开发效率
  • 邯郸网站建设行情免费的拓客平台有哪些
  • 上海网站制作网络推广方法培训网站建设多少钱
  • 代刷网站推广快速软件开发工程师任职要求
  • 网站建设欧美做网站没资源
  • 做外围网站犯法吗网站建设孝感