参考链接:
https://www.jianshu.com/p/87dbf4024cde
https://www.zhihu.com/question/21097237
https://blog.csdn.net/xiongchengluo1129/article/details/78779418
https://www.jianshu.com/p/ee25e2b94eb8
JSON的含义
JSON(Javascript Object Notation)字面意思是Javascript对象表示法,指的是类似于Javascript对象的一种数据格式对象,是一种表现方式。目前这种数据格式比较流行,逐渐替换掉了传统的XML数据格式(JSON比XML更小、更快、更易解析),前端使用AJAX的时候后台返回该前端的数据格式就是JSON格式的。
Python字典和JSON的区别
- Python字典是一种数据结构,JSON是一种数据传输格式。Python字典的字符串表现形式的规则看上去和JSON类似,但是字典本身是一个完整的数据结构,是Python对Hash Table的实现,一套从存储到提取都封装好了的方案,它使用其内置的哈希函数来规划键对应的内容的储存位置,从而获得O(1)的数据读取速度,即实现了一切自身该有的算法;而JSON是一个根据某种约定格式编写的纯字符串/纯文本,不具备任何数据结构的特征,无法直接操作。因此,Python字典的类型是字典,JSON的类型是字符串。例如,一个JSON是str1 = ‘{“a”:1}’,即str1这个变量是一个符合JSON格式的字符串。
- Python字典的键key或者值value的边界符号(若是字符串)可用单引号或者双引号,JSON强制必须使用双引号作为键key或者值value的边界符号(值value如果是数字可以不加双引号,但是键key只能是双引号引起来的字符串)。
- Python字典的键key可以是任意可hash对象(hashable)(所有不可变类型都是可哈希的),JSON的键key只能是字符串。比如,{(1,2):1} 在Python里是合法的,因为tuple是hashable type,{[1,2]:1} 在Python里会出现TypeError: unhashable “list”。
- Python字典的键key不可以重复,JSON的键key可以重复。
- Python字典的键key默认没有默认值,JSON任意键key存在默认值undefined。
- Python字典的值value没有任何限制,可以是任意Python对象(包括首字母大写的布尔值True和False、空值None),JSON的值value只能是字符串、浮点数、小写的布尔值true和false(对应Python的True和False)、空值null(对应Python的None),或者它们JSON所构成的数组或者对象。
- Python字典里可以嵌套tuple,JSON里只有数组array。比如,在json_str = json.dumps(py_dict)方法里,json.dumps({1:2}) 的结果是{“1”:2},json.dumps((1,2)) 的结果是[1,2]。
- JSON中文必须是Unicode编码(UTF-8代表8位一组表示Unicode字符的格式,即UTF-8是Unicode的实现方式之一)。比如,Python字典里{“me”: “我”}是合法的,JSON里必须是{“me”: “\u6211”}。
Python字典和JSON的联系
Python字典存在于内存中,可以被序列化成JSON格式的字符串数据,之后这些数据就可以传输或者存储了。也就是说,这些字符串数据以JSON数据传输格式来传输,这种JSON格式能被解析成Python字典或者其他形式,但解析成什么内容,甚至是否解析,是否储存,都和JSON格式无关。例如,某段Python程序可以把JSON格式的字符串 “{A:1, B:2}” 解析成一对tuple( (“A”, 1), (“B”, 2) )而不是字典{“A”: 1, “B”: 2}。
Python字典和JSON相互转换的方法
1、加载JSON格式数据为Python字典(string -> dict)
(1)json.loads()方法:用来读取字符串,仅将JSON格式的字符串转换为Python字典。示例如下:
# json.loads()直接读取字符串并转换
py_dict = json.loads(json_str)
# 在将文件打开后用read()读取文件返回字符串,再用json.loads()读取字符串并转换
with open('data.json', 'r') as f:
json_str = f.read()
py_dict = json.loads(json_str)
(2)json.load()方法:用来读取文件,打开JSON文件并将里面的JSON格式的字符串转换为Python字典。示例如下:
with open('data.json', 'r') as f:
py_dict = json.load(f)
2、将Python字典以JSON格式保存(dict -> string)
(1)json.dumps()方法:仅将Python字典转换为JSON格式的字符串。示例如下:
json_str = json.dumps(py_dict)
(2)json.dump()方法:将Python字典转换为JSON格式的字符串,并写入JSON文件。示例如下:
with open('data.json', 'w') as f:
json.dump(py_dict, f)
注意:Python 3已经将unicode作为默认编码,Python 3中将一个字典数据写入文件并保存为JSON时,查看JSON数据结果,会发现中文都被转换成unicode编码(字符串\uXXXX)。这是因为json.dumps()方法会将字典数据先转换为string,这个过程中会默认将字典数据中的中文以unicode编码方式输入到string,最后将string写入到文本中。如果不希望将中文转为unicode编码,需要在打开写入文件时加入encoding=“utf8”,且在dump方法中增加一个参数ensure_ascii=False。
with open('data.json', 'w', encoding = 'utf-8') as f:
json.dump(py_dict, f, ensure_ascii=False)