总结放于前:
JSON是一种利用JSON数组和JSON对象描述数据内容的数据格式,采用树状的结构,只能有一个父节点,子节点不设限,但父子节点均为JSON对象或者JSON数组。

1. Json 简介

JSON(JavaScrip Object Notation) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的 js 规范) 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

关于上面的描述可以精简为一句话:Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json。
基于这种通用的数据格式,一般处理两方面的任务:

(1) 组织数据(数据序列化),用于数据的网络传输
通讯过程如下: 假设有一种情况A需要给B发送指令,如果只是一个string类型的信息是很简单的,但是如果这条信息包含:string,int ,double,那么就需要将这些内容放到JSON这种数据格式中,从而得到一个字符串,从A端发送到B端,B就可以按照JSON的格式将字符串解析处理,处理完成之后又按照JSON的格式发送给A端,A端接到信息后进行解析处理,这就是一个AB端发送接收的过程。具体如下图所示:

总结:JSON通讯函数发送的是一个字符串,这样就需要将要发送的内容组织到一个字符串中,发送给对方。

(2) 组织数据(数据序列化),写磁盘文件实现数据的持久化存储(一般以.json 作为文件后缀,适合做为配置文件)
数据在磁盘中的存储就涉及数据的写入和读取,写入需要按照JSON的格式,读取也是读到的为JSON格式的字符串,把读到的字符串按照JSON的数据格式就可以将里面对应的原始数据格式依次读取出来

Json 中主要有两种数据格式:Json 数组和 Json 对象,并且这两种格式可以交叉嵌套使用,下面依次介绍下这两种数据格式:

2. Json 数组

Json 数组使用 [ ] 表示,[ ] 里边是元素,元素和元素之间使用逗号间隔,最后一个元素后边没有逗号。
一个 Json 数组中支持同时存在 多种不同类型的成员,包括: 整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null
直接在[ ] 中写元素,不用像C++中那样定义元素的个数,JSON中的元素是没有上限的,由此可见 Json 数组比起 C/C++ 数组要灵活很多。

(1)Json 数组中的元素数据类型一致

// 整形
[1,2,3,4,5]
// 字符串
["luffy", "sanji", "zoro", "nami", "robin"]

(2)Json 数组中的元素数据类型不一致

[12, 13.34, true, false, "hello,world", null]

(3)Json 数组中的数组嵌套使用

[["cat", "dog", "panda", "beer", "rabbit"],["北京", "上海", "天津", "重庆"],["luffy", "boy", 19]
]

(4)Json 数组和对象嵌套使用
此处将一个JSON对象写入到一个JSON数组中,数组为父节点,对象为一级子节点。JSON对象中只有一个键值对作为二级节点,key值为字符串luffy,他对应的value值还是一个JSON对象作为三级节点,三级节点内包含了若干个键值对

[{"luffy":{"age":19,"father":"Monkey·D·Dragon","grandpa":"Monkey D Garp","brother1":"Portgas D Ace","brother2":"Sabo"}}
]

3. Json 对象

Json 对象使用 { } 来描述,每个 Json 对象中可以存储若干个元素,每一个元素对应一个 键值对(key:value 结构),元素和元素之间使用逗号间隔,最后一个元素后边没有逗号。
对于每个元素中的键值对有以下细节需要注意:
(1) 键值(key)必须是字符串,位于同一层级的键值不要重复(因为是通过键值取出对应的 value 值)
(2) value 值的类型是可选的,可根据实际需求指定,可用类型包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null。

使用 Json 对象描述一个人的信息:

{"Name":"Ace","Sex":"man","Age":20,"Family":{"Father":"Gol·D·Roger","Mother":"Portgas·D·Rouge","Brother":["Sabo", "Monkey D. Luffy"]},"IsAlive":false,"Comment":"yyds"  //最后一个键值对是没有逗号的
}

JSON数组和对象的使用场景:
当数据较为简单时,使用JSON数组,当数据比较复杂需要知道更多的细节信息,就需要将数据放到JSON对象中,但是由于数据的复杂性,很多时候我们需要将JSON数组和JSON对象嵌套使用。

4. 注意事项

通过上面的介绍可用看到,Json 的结构虽然简单,但是进行嵌套之后就可以描述很复杂的事情,在项目开发过程中往往需要我们根据实际需求自己定义 Json 格式用来存储项目数据。

另外,如果需要将 Json 数据持久化到磁盘文件中,需要注意一个问题:在一个 Json 文件中只能有一个 Json 数组或者 Json 对象的根节点,不允许同时存储多个并列的根节点。 下面举例说明:

错误的写法

// test.json
{"name":"luffy","age":19
}
{"user":"ace","passwd":"123456"
}

错误原因:在一个 Json 文件中有两个并列的 Json 根节点(并列包含 Json 对象和 Json 对象、Json 对象和 Json 数组、Json 数组和 Json 数组),根节点只能有一个。

正确的写法:

// test.json
{"Name":"Ace","Sex":"man","Age":20,"Family":{"Father":"Gol·D·Roger","Mother":"Portgas·D·Rouge","Brother":["Sabo", "Monkey D. Luffy"]},"IsAlive":false,"Comment":"yyds"
}

在上面的例子中通过Json对象以及Json数组的嵌套描述了一个人的身份信息,并且根节点只有一个就是Json对象,如果还需要使用Json数组或者Json对象描述其他信息,需要将这些信息写入到其他文件中,不要和这个Json对象并列写入到同一个文件里边,切记!!!

声明: 本篇是在以下视频及链接基础上学习并稍微做了补充,感谢原博主!
学习视频地址:Json简介学习视频
学习笔记网址:笔记网址

Qt中的JSON操作_1: JSON的基本知识介绍(JSON格式、JSON数组、JSON对象、应用场景)相关推荐

  1. Qt 笔记:Qt中的IO操作

    Qt中IO操作的处理方式 -Qt通过统一的接口简化了文件与外部设备的操作方式 -Qt中的文件被看做一种特殊的外部设备 -Qt中的文件操作与外部设备的操作相同 IO操作中的关键函数接口 -打开设备:bo ...

  2. JSON值的类型:数字,字符串,逻辑值,数组,对象,null

    JSON的值可以是: 数字 (整数或浮点数) 字符串 (在双括号中) 逻辑值 (true或false) 数组 (在中括号中) 对象 (在大括号中) null 测试代码 <!DOCTYPE htm ...

  3. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    QTime::QTime() 默认构造函数,构造一个时,分,秒都为0的时间,如00:00:00.000(午夜) QTime::QTime(int h, int m, int s=0, int ms = ...

  4. Json在Qt中的使用

    文章目录 Json在Qt中的使用 主要使用的类 QJsonValue QJsonObject QJsonDocument 实战 1. 手动写Json文件 2. 实现程序(从Json文件中读取数据,更改 ...

  5. 4.QT中进程操作,线程操作

     QT中的线程操作 T19Process.pro SOURCES += \ main.cpp CONFIG += C++11 main.cpp #include <QCoreApplicat ...

  6. modelsim读取文件中的数据_modelsim中的文件操作—— 大数据测试

    在modelsim中不可避免的需要进行文件操作,在窗口中查看代码的操作情况,下面是我自己M序列实验中的一段测试代码 integer i,j ,k,m; integer m_dataFILE , ind ...

  7. Qt中的OpenGL

    Qt还是本人可移植GUI程序开发的首选,不过Qt开发普通的应用程序是行,但是据说效率太低,以至于像某些人说的那种刷新看得到一条条横线?这点我比较纳闷,就我使用的感觉,虽然Qt不以效率著称,但是事实上有 ...

  8. 第十三篇:multimap容器和multiset容器中的find操作

    前言 multimap容器是map容器的" 增强版 ",它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容 ...

  9. 在QT中自定义头文件和源文件的使用方法

    在QT中自定义头文件和源文件的使用方法 最近想用QT来实现一个简单的功能,为了便于函数的集成需要将功能函数进行封装,自己补了些c++的函数封装方法,发现在QT中还不太一样.接来下简单介绍一下具体怎么实 ...

最新文章

  1. CBA 赛程的笔记 - 北京首钢
  2. Philip S. Yu 讲的广度学习到底是什么?
  3. 判断一个字符串的所有字符是否都在另一个字符串中
  4. rabbitmq延迟队列实现
  5. 最简方式 表格编辑 基于 el-table
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第14篇]什么是基于线性对的密码学
  7. Flask werkzeug 源码解析
  8. 新建一个同名域能不能替换原域_能不能挣钱,从你最早设计猪场就已经决定了!...
  9. 高效记忆/形象记忆(09)110数字编码表 31-40
  10. 使用python解析pdf文档中的单词导入到有道云词典中
  11. win7企业版怎么都激活不了,看这里
  12. mysql pxc 安装_MYSQL PXC 集群安装
  13. 计算某年某月某日是星期几(基姆拉尔森计算公式)
  14. 小样儿想封我?WebOS 1.2.1再次突破iTunes同步限制
  15. 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (2)
  16. Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To
  17. 我记忆中的“集银社”
  18. 用SNMP协议实现系统监控
  19. 《Linux命令行与shell脚本大全》笔记
  20. Fine-Grained Classification之车型识别

热门文章

  1. 我的生活与程序员职业规划
  2. java 泛型 type_轻触开源(一)-Java泛型Type类型的应用和实践
  3. 直播网站程序源码,搜索框实现快速搜索功能
  4. java获得U盘根目录、读取图片视频头文件信息、获取视频时长
  5. CSDN校园活动社开展“开学季活动”
  6. 单维度量表验证性因子分析_验证性因子分析CFA.ppt
  7. 田震-雨中的鸟依然在飞-LRC歌词下载
  8. 使用bark App实现向手机推送消息的流程
  9. TCP FIN_WAIT2定时器
  10. python空气质量指数计算_空气质量指数数据分析可视化