当前位置: 首页 > 后端技术 > Python

JSON的使用场景和注意事项介绍

时间:2023-03-26 19:05:11 Python

在上一篇文章中,我们解释了JSON诞生的原因,因为不同的浏览器将XML集成到HTML的细节是不同的,所以道格拉斯·克罗克福德(DouglasCrockford)和奇芯Morningstar一起从JS数据类型中提取了一个子集作为一种新的数据交换格式,因为主流浏览器使用通用的JavaScript引擎组件,所以在解析这种新数据时格式不存在兼容性问题,所以他们将这种数据格式命名为“JavaScriptObjectNotation”》,简称JSON,JSON由此诞生!今天我们就来了解一下JSON的结构、数据类型、使用场景和注意事项!1.JSON格式我们知道JSON是从JavaScript数据类型中抽取出来的一个子集。JSON有几种结构形式?什么数据类型?它们对应于JavaScript中的哪些数据类型?一、JSON的两种结构形式1、键值对形式上一期我们举了一个JSON的例子,是键值对的形式,如下:{"person":{"name":"猪","年龄":"18","性别":"男","家乡":{"省":"江西省","市":"福州市","县":"崇仁县"}}}这种结构的JSON数据规则是:“'名称/值'对”的无序集合。一个对象以{开括号开始,以}闭括号结束。每个“名称”后跟一个:冒号;“名称/值对”由,逗号分隔。2.数组形式因为大家使用的JSON大部分可能都是上面的key-value形式,所以很多人在讲解JSON的时候总是忽略数组形式,这一点需要注意。JSON的数组形式是什么?猪哥也举个例子!["pig",18,"man","江西省抚州市崇仁县"]数组形式的JSON数据是有序的值集合。数组以[左括号开始,以]右括号结束。值用,逗号分隔。2.JOSN的6种数据类型以上两种JSON形式,内部都包含了值。那么有哪些类型的JSON值呢?上一期我们说了JSON其实就是从Js数据格式中抽取出来的一个子集。具体有哪些数据类型?string:字符串,必须用双引号括起来。number:数值,与JavaScript的number一致,整数(不带小数点或指数形式),最多15位。小数点后最多17位。object:JavaScript的对象形式,用{key:value}表示,可以嵌套。array:Array,JavaScript数组表示[值],可嵌套。true/false:布尔类型,JavaScript的布尔类型。null:空值,JavaScript的null。以上数据格式图片来自JSON官方文档:http://www.json.org/json-zh.html二、JSON使用场景介绍完JSON数据格式,我们来看看JSON是怎么使用的更多在企业场景。1、接口返回数据JSON的地方比Web用的多。现在的数据接口基本上就是返回的JSON。具体详细的场景包括:Ajxa异步获取数据RPC远程调用前端分离后端返回的数据开放API,如百度、高德等企业间开放接口,此类API接口一般提供接口文档,解释接口的入参、出参等,一般接口返回的数据都会封装成JSON格式,比如下面的{"code":1,"msg":"success","data":{"name":"猪","age":"18","sex":"男","家乡":{"province":"江西省","city":"福州市","county":"崇仁县"}}}2、序列化程序运行时所有的变量都保存在内存中。如果程序重新启动或机器停机,数据将丢失。一般情况下,运行时变量并没有那么重要而丢失,只是内存中的一些数据需要保存下来,以供下一个程序或其他程序使用。将数据保存在内存中,要么保存在数据库中,要么直接保存到文件中,将内存中的数据变成可以保存或传输的数据的过程称为序列化,在Python中称为pickling,也就是在其他语言中称为酸洗。称之为序列化、编组、扁平化等,都是同一个意思。普通的序列化是将编程语言中的对象直接转化为storable或者transferable,这样会保存对象的类型信息,而JSON序列化是不会保留对象类型的!为了让大家更直观的感受到区别,朱哥用代码做了一个测试。一看就知道,Python对象直接序列化会保存类信息,下次用loads加载到内存时,就直接变成Python对象了。JSON对象序列化只保存属性数据,不保留类信息。下次使用loads加载内存时,直接转成dict对象即可,当然也可以转成Person对象,只是需要写个辅助方法。对于JSON序列化不能保存类信息的特性,JSON序列化有什么用呢?答案当然是对不同编程语言的序列化阅读有用。比如:我用Python爬取数据,并转化为对象。现在我需要把它序列化到磁盘上,然后用Java语言来读取这个数据。这时由于跨语言的数据类型不同,需要进行JSON序列化。存在即合理,两个连载可以根据需要选择!3.生成Token首先声明Token有多种形式,如JSON、字符串、数字等,只要能满足要求即可,使用哪种形式没有规定。JSON格式中最具代表性的令牌是JWT(JSONWebTokens)。随着技术的发展和分布式web应用的普及,通过Session管理用户登录状态的成本越来越高,所以逐渐发展成Token的方式进行登录身份验证,然后使用Token获取缓存的用户在RedisInformation中,随着后来JWT的出现,校验方式更加简单方便。不需要经过Redis缓存,直接根据Token获取保存的用户信息,并检查Token是否可用。单点登录更简单。猪哥也用JWT做了一个app登录系统。大致流程是:用户输入用户名和密码,APP请求登录中心验证用户名和密码。如果验证通过,则生成一个Token,其中包括:用户的uid,Token过期。时间、过期和延期时间等,然后返回app获取Token,保存在cookie中,下次请求其他服务时,带上其他服务获取Token,调用登录中心接口验证验证,然后响应JWT登录。登录认证有什么优点:性能好:服务器不需要保存大量的session单点登录(登录一个应用,同一企业的其他应用可以访问):使用JWT做一个登录中心基本搞定了,也很容易实现。兼容性好:支持移动设备,支持跨程序调用,cookie不允许跨域访问,但Token不存在这个问题。安全性好:因为有签名,JWT可以防止篡改。更多JWT相关知识可以自行上网学习,本文不做过多介绍!4.配置文件说实话,使用JSON作为配置文件的场景并不多。最具代表性的是npm的package.json包管理配置文件。下面是npm的一个package.json配置文件的内容。{"name":"server",//项目名称"version":"0.0.0","private":true,"main":"server.js",//项目入口地址,即执行后npmExecutedproject"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作为配置文件。3、Python中JSON的使用最后,我们来看一下Python中操作JSON的方法。在Python中操作JSON时,需要引入json标准库。导入json1。类型转换1、Python类型转JSON:json.dump()#1、Pythondict类型转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=lambdaobj:obj.__dict__,indent=4)print(person_obj_json,'\n')执行结果:2.JSON转Pythontype:json.loads()#4.JSON转Pythondicttypeperson_json='{"name":"pig","age":18,"sex":"man","家乡":"江西抚州"}'person_json_dict=json.loads(person_json)print(type(person_json_dict),'\n')#5.JSON转Python列表typeperson_json2='["猪",18,"人","江西福州"]'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=lambdad:Person(d['name'],d['age'],d['sex'],d['hometown']))print(type(person_json_obj),'\n')执行结果如下:2.对应的数据类型上面我们演示了Python类型和JSON的相互转换,一开始我们说JSON有6种数据类型,这6种数据类型分别对应Python中的哪些数据类型??3.注意点:JSON键名和字符串必须用双引号括起来,Python中单引号也可以表示为字符串,所以这是一个比较容易犯的错误!在Python类型和JSON之间转换的时候你使用load/dumporloads\dumps?它们有什么区别?什么时候加s,什么时候不加s?看源码就能找到答案:不带s的方法加一个more参数fp表示文件路径,最后还有一个写入文件的操作,所以我们记的时候可以这样记:加s表示转为字符串(str),不加s表示转为文件.Python自定义对象与JSON相互转换当需要辅助方法指定属性与键名的对应关系时,如果不指定方法会抛出异常!相信有仔细阅读的同学会很好奇猪哥当年使用json.dumps方法将Python类型转成JSON的时候,如果有中文,就会出现这样的:u6c5fu897fu629au5dde,这是为什么呢?原因是:Python3中的json在做dump的时候,会把中文转成unicode,并以16进制存储。它不是UTF-8格式!4.总结今天我们学习了JSON的2种形式,记住JSON有[...]这种形式。学习了JSON的6种数据类型以及它们在Python中的类型。了解JSON的一些使用场景和实际例子。我还学习了如何在Python中使用JSON和注意事项。结合上一期JSON的诞生和发展的介绍,我们的JSON相关知识基本介绍完了,后面会展示一些爬虫的实际案例,教大家如何解析和返回JSON数据。一个JSON知识点分成两篇长文(近万字),其重要性不言而喻。因为无论你是爬虫、数据分析、web,甚至是前端、测试、运维,JSON都是你必须掌握的知识点!