XML 在 JSON 出现之前,是一个主流的数据交换格式,大部分互联网上的服务,它们之间交换数据的时候都采用XML的格式。但是自从轻量级的 JSON 出现了之后,使用 XML 的越来越少了。
{ "name":"Alice", "age":18, "hight":null }
- {
- "sites": [
- { "name":"菜鸟教程" , "url":"www.runoob.com" },
- { "name":"google" , "url":"www.google.com" },
- { "name":"微博" , "url":"www.weibo.com" }
- ]
- }
- myObj = {
- "name":"网站",
- "num":3,
- "sites": [
- { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] },
- { "name":"Runoob", "info":[ "菜鸟教程", "菜鸟工具", "菜鸟微信" ] },
- { "name":"Taobao", "info":[ "淘宝", "网购" ] }
- ]
- }
在Python中,用我们已知的一些内置数据类型,如列表、字典、元组、集合来操作数据结构会比直接操作JSON字符串要方便和简单的多。
JSON是可以跨语言和平台的,与语言无关的。每一个JSON字符串都可以每个语言里面找到一个对应的数据结构。
在Python中,提供了一个内置模块JSON,这个模块有一系列的方法来帮助我们操作JSON数据。
在编程里面,有一个术语,叫反序列化。用来定义由字符串到某一种语言下面的某一种数据结构的解析过程。
- import json
-
- json_str = '{"name":"Alice","age":18}'
-
- student = json.loads(json_str)
-
- print(type(student)) # 返回:
,说明json.loads()返回的是一个字典 - print(student) # 返回:{'name': 'Alice', 'age': 18}
- print(student['name']) # 返回:Alice
- print(student['age']) # 返回:18
这个 JSON 字符串在 JavaScript 里面表示的是一个 JSON 对象,但是,在 Python 里面它变成了一个字典。
对于同样的这样的一个 JSON 字符串,不同的语言,有可能把 JSON 字符串会变成不同的数据类型,怎么理解呢?我们在 Python 里面,确实是把这样的一个 JSON 字符串转换成了一个字典类型,但是,其他的一些语言有可能不是把它转成这样的一个字典类型,有可能会把它转换成另外的数据结构,比如哈希列表等等,这个呢,都是不一定的。
JSON 字符串对应到 JSON 数据结构里面,它表示的是 JSON 的一个对象。但是,它转换到Python 里面来的时候,是用一个字典的方式来承载 JSON 对象所表示的信息。
在 JSON 数据格式里面啊,它并不仅仅只有 JSON 对象(object)这一种数据类型。它还有数组(array)。
- import json
-
- json_str = '[{"name":"Alice","age":18},{"name":"John","age":20}]'
-
- student = json.loads(json_str)
- print(type(student)) # 返回:
,说明json.loads()返回的是一个列表 - print(student) # 返回:[{'name': 'Alice', 'age': 18}, {'name': 'John', 'age': 20}]
这个 JSON 字符串在 JavaScript 里面表示的是一个 JSON 数组,但是,在 Python 里面它变成了一个含有两个字典的列表。
为什么这个列表的内部元素是两个字典呢?这是与 JSON 字符串相对应的,JSON 字符串是一个数组,对应 Python 的列表,数组内部是两个 JSON对象,所以对应 Python 的是两个字典。
- import json
-
- json_str = '[{"name":"Alice","flags":false},{"name":"John","flags":true}]'
-
- student = json.loads(json_str)
- print(type(student)) # 返回:
,说明json.loads()返回的是一个列表 - print(student) # 返回:[{'name': 'Alice', 'flags': False}, {'name': 'John', 'flags': True}]
上例中,我们把 JSON 字符串中的数据 flags 的值改成一个布尔值。在 JSON 数据格式里面,布尔值是小写的 false 或者 true 。注意:布尔值不是字符串,我们不需要加双引号。
我们注意一下在 Python 中解析出来的结果:小写的 false 和 true 转换成了首字母大写的 False 和 True 。
举了这么多事例呢,无非是想告诉大家,JSON 有自己的一些数据类型。而我们用 json.loads()函数最主要做的一件事情,就是把 JSON 的数据类型转化成 Python 自己的数据类型。
JSON和Python之间的数据类型对比 | ||
数据类型 | JSON | Python |
字符串 | JSON中的字符串必须是双引号(")包围的。 | Python中的字符串可以使用单引号(')或双引号(")包围。 |
数字 | JSON支持整数和浮点数 | Python中的数字类型更加丰富,包括整数(int)、浮点数(float)、复数(complex)等 |
布尔值 | JSON支持true 和false 两个布尔值。 | Python使用True 和False 表示布尔值(注意大小写)。 |
数组/列表 | JSON使用数组(array)来表示一组有序的值。 | Python使用列表(list)来表示一组有序的元素。 |
对象/字典 | JSON使用对象(object)来表示键值对的集合。 | Python使用字典(dict)来表示键值对的集合。 |
null值 | JSON有一个null 值,表示空或不存在的值。 | Python使用None 来表示空或不存在的值。 |
其他数据 | Python还支持更多的数据类型,如元组(tuple)、集合(Set)、日期时间等,而JSON则没有这些数据类型。 |
上面的内容给大家演示了 JSON 的数据类型到 Python 数据类型的转换方法,就是使用 json.loads(),但是,要强调的是上面所讲的重点并不是介绍如何使用 json.loads() ,关键是想要告诉大家这样的一个 JSON 和 Python 之间的转换关系,这一点比我们会使用 json.loads() ,要重要的太多了。
序列化就是把 Python 的数据类型向 JSON 数据类型转换的一个过程。它同样是调用了 JSON 模块下面的一个函数 json.dumps() 。
- import json
-
- # 把Python列表转换成JSON字符串
- python_list = [
- {'name':'Alice','age':'18','flags':False},
- {'name':'John','age':'20'}
- ]
-
- json_string = json.dumps(python_list)
- print(type(python_list)) #
,这里是python的一个列表 - print(type(json_string)) #
,这里是一个JSON字符串 - print(json_string)
- # 返回一个JSON数组
- # [{"name": "Alice", "age": "18", "flags": false}, {"name": "John", "age": "20"}]
在这段代码中,我们使用 Python 的 JSON
模块将 Python 列表(python_list
)转换成了 JSON 格式的字符串(json_string
)。这个过程主要涉及到 json.dumps()
函数,该函数的作用是将Python 对象(如列表、字典等)序列化成 JSON 格式的字符串。
python_list
是一个Python列表,其中包含两个字典。每个字典都代表一个人的信息,包括名字(name
)、年龄(age
)和标志(flags
)。json.dumps()
函数:json.dumps()
函数用于将Python对象转换(或称为“序列化”)为JSON格式的字符串。这个函数非常有用,当你需要将Python数据结构与JSON格式相互转换时。
python_list
作为参数传递给json.dumps()
。python_list
中的每个元素(在这里是字典),并将它们转换为JSON格式。json_string
变量。类型检查:python_list
的类型是
,表示它是一个Python列表。而json_string
的类型是
,表示它是一个字符串,即JSON格式的字符串。
打印JSON字符串:输出的结果是一个JSON数组,其中包含两个对象(对应于原始Python列表中的两个字典)。
注意点:
False
在JSON中表示为false
(全部小写)。'18'
和'20'
在JSON中仍然是字符串,而不是数字。通过这个过程,我们可以方便地在 Python 和 JSON 之间转换数据,这对于与Web服务交互或存储和读取数据非常有用。这就叫做序列化。
这里要跟大家强调一下,并不是和 JSON 相关的这样一系列的转化才叫做序列化,如果我们把 XML的字符串向 Python 的数据结构转换,或者,把 Python 的数据结构向 XML字符串转换,它这个过程也称为序列化或者反序列化。
(小提示:怎样把一个对象存储到数据库里去呢?
数据库是一个二维表,它没有办法去表示一个对象的结构。所以,一个方法就是把对象序列化成JSON 字符串或者 XML字符串。然后把字符串存到这个数据库里去。
当你要需要这个对象的时候,可以把这个字符串从数据库里读出来,然后再进行反序列化的过程。但是,实际上这个是不可取的,因为效率太低了。这个办法在操作数据库或者是其他类型的数据库,还是比较适合去存储一些比较简单的数据结构。
而像对象这种东西,应该把对象拆成一个二维表结构,也就是说把对象分成一个个的属性,把它存到这数据库里会比较合适。强烈反对把对象给序列化之后,以字符串的形式存储到数据库里。)
上一节,我们写了一个 JSON 字符串,然后把它给反序列化成了 Python 字典。但是,我们要考虑的是这个 JSON 字符串是从哪里来的呢?
这不太可能是我们自己一个一个地写出来的。其实,一般情况下这个 JSON 字符串还是我们通过序列化的过程来的。有可能是通过其他语言序列化之后,通过一个服务的形式传给我们的。
下面举一个比较实际的例子,比如:
- {
- "msg":"invalid_apikey, Please contact bd-team@douban.com for authorized access.",
- "code":104,
- "request":"GET \/v2\/movie\/top250"
- }
从这个事例可以看到:为什么说 JSON 是一个数据交换的格式呢?我们可以明显的看到这个数据是从豆瓣的服务这里以 JSON 数据格式的形式,传送到我们自己的浏览器。既然是数据,它就必然要有一个承载的格式。大多数情况都是选择用 JSON 数据格式来传递数据。
JSON、JSON对象、JSON字符串这三者的区别,如果在网上搜一搜,说法各种各样、五花八门,不能说它错,但并不全面。
网上对于这三者的解释都没有跳出 JavaScript 这样的一个范围,都是站在 JavaScript 这个特定语言的角度阐述这三者的区别。所以,我们要跳出语言的范畴来看待这三个不同的名词。
因为 JSON 的数据交换和 JavaScript 是没有什么区别的,很多人很容易会认为 JavaScript 很特殊,它和 JSON 是有一些特殊关系的。
其实没有,那么造成这种误区的原因?可能有两个方面:
第一个方面是 JSON数据类型和JavaScript 的数据类型太过于相似。所以,很多人一直搞不清楚 JSON 和 JavaScript 的关系。
JavaScript 和 JSON 之间的关系:JavaScript这个语言它只是一个标准的实现方案之一,这个标准就是EcmaScript。还有以前写flash程序的时候,有个ActionScript。这个其实也是实现这个EcmaScript 标准的另外一种语言。我们可以把 JSON 也理解为是实现 EcmaScript 标准的一个的版本。
JSON 并不是JavaScript的一个附属品,这一点呢,大家一定要清楚。所以,某种程度上来说,JSON 可以看作是和 JavaScript 平齐的一种语言。因为 JSON 和JavaScript 都是对 EcmaScript 这个规范和标准的实现。
第二个方面是 JSON最开始的时候,在外部前后端分离的过程中起到了重要的作用。而我们服务器的语言有很多很多种,但是前端里边,现在最主流的就是一个JavaScript。因为 JSON 被大量的应用于JavaScript的交互中,所以会让很多人产生这样的一个误区。
那么对应到三个名词上面,JSON字符串、JSON,我们不再说了。我们重点要说的是这个JSON对象。JSON对象确实存在,但它的定义非常片面。
片面在什么地方呢?如果把JSON对象放到JavaScript里面来说的话呢?JSON对象这个说法是成立的,但是问题是:如果跳出了这个JavaScript的范畴,比如说放到Phthon里面,其实是没有JSON对象这个说法的啊。所以,如果你在搜索引擎里面去搜索JSON字符串和JSON对象的区别,绝大多数的答案都是以 JavaScript 这个语言为蓝本的。
JSON 是一个比较独立的数据类型。它和 JavaScript 没有特定的关系。跳出语言层面,如果我们要实现在两种不同的语言之间传递数据:
第一种情况:世界上只有两种语言,我们可以直接按照一定的规则,把A语言的数据类型转换成B语言的数据类型就可以了,JSON没有存在的必要。
第二种情况:显然,第一种情况是不存在的,目前已经有许多种语言,要实现两两之间的转换,就需要写若干种规则,这显然也是不靠谱的,这时就需要有一种中间类型的语言(或者一种中间的数据类型的格式)来作为一个标准,所有的语言都向这个中间数据类型来转换,这样就可以实现不同语言之间的快速转换。
所以,很多时候,我们应该把它理解成是一个中间的数据类型的转换格式。