来自:裸睡的猪

上篇我们讲解了JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(Chip Morningstar)一起从JS的数据类型中提取了一个子集,作为新的数据交换格式,因为主流的浏览器使用了通用的JavaScript引擎组件,所以在解析这种新数据格式时就不存在兼容性问题,于是他们将这种数据格式命名为 “JavaScript Object Notation”,缩写为 JSON,由此JSON便诞生了!

今天我们来学习一下JSON的结构形式、数据类型、使用场景以及注意事项吧!

目录:

一、JSON格式

1.JSON的2种结构形式

2.JOSN的6种数据类型

二、JSON使用场景

1.接口返回数据

2.序列化

3.生成Token

4.配置文件

三、JSON在Python中的使用

1.类型转换

2.对应的数据类型

3.需要注意的点

四、总结

一、JSON格式

上面我们知道JSON是从JavaScript的数据类型中提取出来的子集,那JSON有几种结构形式呢?又有哪些数据类型呢?他们又分别对应着JavaScript中的哪些数据类型呢?

1.JSON的2种结构形式

1、键值对形式

上期我们举了一个JSON的实例,就是键值对形式的,如下:

{  "person": {    "name": "pig",    "age": "18",    "sex": "man",    "hometown": {      "province": "江西省",      "city": "抚州市",      "county": "崇仁县"    }  }}

这种结构的JSON数据规则是:一个无序的“‘名称/值’对”集合。一个对象以 {左括号 开始, }右括号 结束。每个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间使用 ,逗号 分隔

2、数组形式

因为大多数的时候大家用的JSON可能都是上面那种key-value形式,所以很多人在讲解JSON的时候总是会忽略数组形式,这一点是需要注意的。

那JSON的数组形式是怎么样的呢?猪哥也举一个实例吧!

["pig", 18, "man", "江西省抚州市崇仁县"]

数组形式的JSON数据就是值(value)的有序集合。一个数组以 [左中括号 开始, ]右中括号 结束。值之间使用 ,逗号 分隔。

2.JOSN的6种数据类型

上面两种JSON形式内部都是包含value的,那JSON的value到底有哪些类型,而且上期我们说JSON其实就是从Js数据格式中提取了一个子集,那具体有哪几种数据类型呢?

  1. string:字符串,必须要用双引号引起来。

  2. number:数值,与JavaScript的number一致,整数(不使用小数点或指数计数法)最多为 15 位,小数的最大位数是 17

  3. object:JavaScript的对象形式,{ key:value }表示方式,可嵌套。

  4. array:数组,JavaScript的Array表示方式[ value ],可嵌套。

  5. true/false:布尔类型,JavaScript的boolean类型。

  6. null:空值,JavaScript的null。


以上数据形式图片来源JSON官方文档:http://www.json.org/json-zh.html

二、JSON使用场景

介绍完JSON的数据格式,那我们来看看JSON在企业中使用的比较多的场景。

1.接口返回数据

JSON用的最多的地方莫过于Web了,现在的数据接口基本上都是返回的JSON,具体细化的场景有:

  1. Ajxa异步访问数据

  2. RPC远程调用

  3. 前后端分离后端返回的数据

  4. 开放API,如百度、高德等一些开放接口

  5. 企业间合作接口

这种API接口一般都会提供一个接口文档,说明接口的入参、出参等,

一般的接口返回数据都会封装成JSON格式,比如类似下面这种

{  "code": 1,  "msg": "success",  "data": {    "name": "pig",    "age": "18",    "sex": "man",    "hometown": {      "province": "江西省",      "city": "抚州市",      "county": "崇仁县"    }  }}

2.序列化

程序在运行时所有的变量都是保存在内存当中的,如果出现程序重启或者机器宕机的情况,那这些数据就丢失了。一般情况运行时变量并不是那么重要丢了就丢了,但有些内存中的数据是需要保存起来供下次程序或者其他程序使用。

保存内存中的数据要么保存在数据库,要么保存直接到文件中,而将内存中的数据变成可保存或可传输的数据的过程叫做序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

正常的序列化是将编程语言中的对象直接转成可保存或可传输的,这样会保存对象的类型信息,而JSON序列化则不会保留对象类型

为了让大家更直观的感受区别,猪哥用代码做一个测试,大家一目了然

  1. Python对象直接序列化会保存class信息,下次使用loads加载到内存时直接变成Python对象。

  2. JSON对象序列化只保存属性数据,不保留class信息,下次使用loads加载到内存可以直接转成dict对象,当然也可以转为Person对象,但是需要写辅助方法。

对于JSON序列化不能保存class信息的特点,那JSON序列化还有什么用?答案是当然有用,对于不同编程语言序列化读取有用,比如:我用Python爬取数据然后转成对象,现在我需要将它序列化磁盘,然后使用Java语言读取这份数据,这个时候由于跨语言数据类型不同,所以就需要用到JSON序列化。

存在即合理,两种序列化可根据需求自行选择!

3.生成Token

首先声明Token的形式多种多样,有JSON、字符串、数字等等,只要能满足需求即可,没有规定用哪种形式。

JSON格式的Token最有代表性的莫过于JWT(JSON Web Tokens)。

随着技术的发展,分布式web应用的普及,通过Session管理用户登录状态成本越来越高,因此慢慢发展成为Token的方式做登录身份校验,然后通过Token去取Redis中的缓存的用户信息,随着之后JWT的出现,校验方式更加简单便捷化,无需通过Redis缓存,而是直接根据Token取出保存的用户信息,以及对Token可用性校验,单点登录更为简单。

猪哥也曾经使用JWT做过app的登录系统,大概的流程就是:

  1. 用户输入用户名密码

  2. app请求登录中心验证用户名密码

  3. 如果验证通过则生成一个Token,其中Token中包含:

    用户的uid、Token过期时间、过期延期时间等,然后返回给app

  4. app获得Token,保存在cookie中,下次请求其他服务则带上

  5. 其他服务获取到Token之后调用登录中心接口验证

  6. 验证通过则响应

JWT登录认证有哪些优势:

  1. 性能好:服务器不需要保存大量的session

  2. 单点登录(登录一个应用,同一个企业的其他应用都可以访问):使用JWT做一个登录中心基本搞定,很容易实现。

  3. 兼容性好:支持移动设备,支持跨程序调用,Cookie 是不允许垮域访问的,而 Token 则不存在这个问题。

  4. 安全性好:因为有签名,所以JWT可以防止被篡改。

更多JWT相关知识自行在网上学习,本文不过多介绍!

4.配置文件

说实话JSON作为配置文件使用场景并不多,最具代表性的就是npm的package.json包管理配置文件了,下面就是一个npm的package.json配置文件内容。

{  "name": "server",       //项目名称  "version": "0.0.0",  "private": true,  "main": "server.js",   //项目入口地址,即执行npm后会执行的项目  "scripts": {    "start": "node ./bin/www"  ///scripts指定了运行脚本命令的npm命令行缩写  },  "dependencies": {    "cookie-parser": "~1.4.3",  //指定项目开发所需的模块    "debug": "~2.6.9",    "express": "~4.16.0",    "http-errors": "~1.6.2",    "jade": "~1.11.0",    "morgan": "~1.9.0"  }}

但其实JSON并不合适做配置文件,因为它不能写注释、作为配置文件的可读性差等原因。

配置文件的格式有很多种如:toml、yaml、xml、ini等,目前很多地方开始使用yaml作为配置文件格式。

三、JSON在Python中的使用

最后我们来看看Python中操作JSON的常用方法有哪些,在Python中操作JSON时需要引入json标准库。

import json

1.类型转换

1、Python类型转JSON:json.dump()

# 1、Python的dict类型转JSONperson_dict = {'name': 'pig', 'age': 18, 'sex': 'man', 'hometown': '江西抚州'}# indent参数为缩进空格数person_dict_json = json.dumps(person_dict, indent=4)print(person_dict_json, '\n')
# 2、Python的列表类型转JSONperson_list = ['pig', 18, 'man', '江西抚州']person_list_json = json.dumps(person_list)print(person_list_json, '\n')
# 3、Python的对象类型转JSONperson_obj = Person('pig', 18, 'man', '江西抚州')# 中间的匿名函数是获得对象所有属性的字典形式person_obj_json = json.dumps(person_obj, default=lambda obj: obj.__dict__, indent=4)print(person_obj_json, '\n')

执行结果:

2、JSON转Python类型:json.loads()

# 4、JSON转Python的dict类型person_json = '{ "name": "pig","age": 18, "sex": "man", "hometown": "江西抚州"}'person_json_dict = json.loads(person_json)print(type(person_json_dict), '\n')
# 5、JSON转Python的列表类型person_json2 = '["pig", 18, "man", "江西抚州"]'person_json_list = json.loads(person_json2)print(type(person_json_list), '\n')
# 6、JSON转Python的自定义对象类型person_json = '{ "name": "pig","age": 18, "sex": "man", "hometown": "江西抚州"}'# object_hook参数是将dict对象转成自定义对象person_json_obj = json.loads(person_json, object_hook=lambda d: Person(d['name'], d['age'], d['sex'], d['hometown']))print(type(person_json_obj), '\n')

执行结果如下:

2.对应的数据类型

上面我们演示了Python类型与JSON的相互转换,最开始的时候我们讲过JSON有6种数据类型,那这6种数据类型分别对应Python中的哪些数据类型呢?

3.需要注意的点

  1. JSON的键名和字符串都必须使用双引号引起来,而Python中单引号也可以表示为字符串,所以这是个比较容易犯的错误!

  2. Python类型与JSON相互转换的时候到底是用load/dump还是用loads\dumps

    他们之间有什么区别?

    什么时候该加s什么时候不该加s

    这个我们可以通过查看源码找到答案:

    不加s的方法入参多了一个fp表示filepath,最后多了一个写入文件的操作。

    所以我们在记忆的时候可以这样记忆:

    s表示转成字符串(str),不加s表示转成文件

  3. Python自定义对象与JSON相互转换的时候需要辅助方法来指明属性与键名的对应关系,如果不指定一个方法则会抛出异常!

  4. 相信有些看的仔细的同学会好奇上面猪哥使用json.dumps方法将Python类型转JSON的时候,如果出现中文,则会出现:

    \u6c5f\u897f\u629a\u5dde这种东西,这是为什么呢?

    原因是:

    Python 3中的json在做dumps操作时,会将中文转换成unicode编码,并以16进制方式存储,而并不是UTF-8格式!

四、总结

今天我们学习了JSON的2种形式,切记JSON还有[...]这种形式的。

学习了JSON的6种数据类型他们分别对于Python中的哪些类型。

了解了JSON的一些使用场景以及实际的例子。

还学习了在Python中如何使用JSON以及需要注意的事项。

结合上期的JSON的诞生与发展介绍,我们JSON相关的知识基本就介绍的差不多,后面会出一些爬虫实际案例来教大家如何解析返回JSON数据。

一个JSON知识点却分两篇长文(近万字)来讲,其重要性不言而喻。因为不管你是做爬虫、还是做数据分析、web、甚至前端、测试、运维,JSON都是你必须要掌握的一个知识点

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

互联网技术都应该了解的一种数据格式——JSON相关推荐

  1. json java 数据类型_程序员都应该了解的一种数据格式之 JSON

    原标题:程序员都应该了解的一种数据格式之 JSON 作者 | 猪哥 责编 | maozz JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Doug ...

  2. 程序员都应该了解的一种数据格式之 JSON

    作者 | 猪哥 责编 | maozz JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(C ...

  3. 发展前景好的互联网技术方面,你觉得比较适合女孩子的都有哪些啊?

    作为一名IT领域的科研教育工作者,我来回答一下这个问题. 首先,从技术发展趋势来看,当前大数据.区块链.物联网.人工智能等相关技术就有比较好的发展前景,而且这些领域有很多细分技术方向比较适合女生来学习 ...

  4. UI培训技术分享:设计大神都在用的10种技法!

    越来越多的人开始学习UI设计,想要进群到UI设计这个行业,本期小编为大家介绍的UI培训教程就是关于设计师会经常用到的一些技巧,帮助大家后期的工作中的应用. UI培训技术分享:设计大神都在用的10种技法 ...

  5. 世界顶尖精密仪器技术都掌握在哪些国家?

    来源:仪商网 科技乃第一生产力,而技术经过时间的沉淀,岁月的积累,现实的实践,具备了引领时代的力量后,这样技术就被称为全世界最顶尖的技术.而精密仪器又是开展前沿科学研究.推动技术发展必不可少的科研工具 ...

  6. 互联网技术架构的启示

     互联网技术架构的启示 最近,"金融电子化"的微信(fcmag1993)中发表了中国建设银行信息技术管理部副总经理王申科撰写的一篇精彩文章"互联网技术架构给我们的启示 ...

  7. 互联网技术2007热点技术

    本文由Richard MacManus, Ebrahim Ezzy, Emre Sokullu, Alex Iskold和Rudy De Waele创作.John Milan本来也想参与,但他不幸困在 ...

  8. 本训练中心主任致互联网技术学员

    正文[编辑] 各位朋友,大家好:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...

  9. BAT解密:互联网技术发展之路(1) - 技术发展的驱动力

    BAT解密:互联网技术发展之路(1) - 技术发展的驱动力 互联网行业是一个快速发展.快速变化的行业,新的业务.新的机会层出不穷,新的技术如雨后春笋般冒出,NoSQL.大数据.云.Node.js.Do ...

最新文章

  1. Python抓取新浪新闻数据(三)
  2. 通过CPAN安装Perl模块
  3. 学python找工作好找吗-前辈经历告诉你Python新手好找工作吗?初级岗位多不多
  4. python为什么不能自动语法_Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?...
  5. Mysql在Windows上离线安装与配置
  6. Spark 1.2 编译
  7. vim多窗口使用技巧
  8. oracle ora 08103,ORA-08103: 对象不再存在
  9. 我的常用软件大公开!
  10. 如何查询日志文件中的所有ip,正则表达式
  11. linux中对数据怎么降序,Linux系统sort排序命令怎么使用
  12. JavaScript-箭头函数
  13. mysql保存表出错1075_navicat出现错误1075怎么办
  14. 报告表明混合云带来IT管理挑战
  15. tomcat websock html5,websocket实战(4) websocket版贪食蛇游戏(tomcat官方自带)
  16. boost noncopyable实现禁止类拷贝
  17. BZOJ1079[SCOI2008] 着色方案
  18. 谭浩强《C语言程序设计第五版》第一章学习笔记
  19. RBF神经网络算法分析与应用(适合快速入门实战)
  20. numpy使用np.dot函数或者@操作符计算两个numpy数组的点积数量积(dot product、scalar product)

热门文章

  1. 关于学习Python的一点学习总结(5->切片赋值->sort排序->列表操作)
  2. 主席树 + 树上倍增 ---- codeforces 587C[树上倍增或者主席树]
  3. php域名黑名单,thinkphp 6 IP 黑名单功能
  4. python将注释写入xml_python 注释xml的元素
  5. luogu P1231 教辅的组成(建图、拆点、最大流)
  6. Markdown学习之路
  7. Dedecms5.7搜索结果页空白无内容的解决方法
  8. Java_基础_01_static和final
  9. 一口气搞懂《虚函数和纯虚函数》
  10. 面试题及相关参考答案