一、JSON是什么?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,是JavaScript的子集,易于人类阅读和编写。
JSON建构于两种结构:json是Javascript中的对象和数组中的对象,本质上来讲就是有特定结构的字符串,所以可以通过这两种结构可以表示各种复杂的结构:
1 对象: 对象在js中表示为”{}”括起来的内容,数据结构为{key:value, key:value…}的键值对结构,在面向对象的语言中,key为对象的属性,value为对应属性的值,所以很容易去理解。属性值value可以为:数字、字符串、数组、对象等。
2 数组:数组在js中是中括号“[]”括起来的内容,数据结构为[“java”, “javascript”, “vb”….] 取值方式和所有语言一样,使用索引获取,字段值的类型是:数字、字符串、数组、对象等
简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比”名称 / 值对”更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
按照最简单的形式,可以用下面这样的 JSON 表示 “名称 / 值对” :{ “firstName”: “Brett” }
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。
如:
{undefined
"people":[
{"firstName": "111", ....},
{"firstName": "222",...},
{"firstName": "333",...}
]}
需要注意的是JSON中
1.名称必须加双引号
2.值可以是加双引号的字符串、数字、bool型、null、数组、或者对象
二、python数据类型与json数据类性的映射关系
Python | JSON |
---|---|
dict | object |
list,tuple | array |
str,unicode | string |
int,long,float | number |
True | true |
False | false |
None | null |
三、dumps()、loads()、dump()、load()
方法 | 描述 |
---|---|
json.dumps() | 将python对象编码成json字符串 |
json.loads() | 将已编码的json字符串解码成python对象 |
json.dump() | 将python内置类型序列化为json对象后写入文件 |
json.load() | 读取文件中json形式的字符串转化为python类型 |
dumps()和loads()
举个例子:
# encoding: utf-8
import json
data = {'name': '中文', 'sex': 'male', '年龄': 26}
# 将python字典对象编码成json字符串
json_str = json.dumps(data)
print(json_str)
print(type(json_str))
# 将json字符串解码为python字典对象
data1 = json.loads(json_str)
print(data1)
print(type(data1))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{"name": "\u4e2d\u6587", "sex": "male", "\u5e74\u9f84": 26}
<class 'str'>
{'name': '中文', 'sex': 'male', '年龄': 26}
<class 'dict'>
Process finished with exit code 0
上面可以看到,在json中,使用的都是双引号
再举个元组和列表的例子:
# encoding: utf-8
import json
data = (1, 2, 3, 4)
data_json = [1, 2, 3, 4]
# 将python对象编码成json字符串
print(json.dumps(data))
print(json.dumps(data_json))
# 将json字符串解码成python对象
a = json.dumps(data)
b = json.dumps(data_json)
print(json.loads(a))
print(json.loads(b))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
Process finished with exit code 0
元组和列表解析出来都是数组
dump()和load()
# encoding: utf-8
import json
data = {
'name': '中文',
'a': [1, 2, 3, 4],
'b': (1, 2, 3)
}
with open('json_test.txt', 'w+') as f:
json.dump(data, f)
with open('json_test.txt', 'r+') as f:
print(json.load(f))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{'name': '中文', 'a': [1, 2, 3, 4], 'b': [1, 2, 3]}
Process finished with exit code 0
四、参数解释
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
# obj: 表示是要序列化的对象
# fp: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入
# skipkeys:布尔型,默认为False,如果设为True的话,在dict中的key值如果出现非 (str, unicode, int, long, float, bool, None)对象,则跳过该key而不是抛出ValueError
# ensure_ascii:布尔型,默认为True,如果为true则所以传入的非ASCII字符都被转义,如果为False则字符将被原样输出
# check_circular:默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError
# allow_nan: 默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)
# indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。一般设为4,如果设为0则只会添加换行符。 indent参数根据数据格式缩进显示,读起来更加清晰。
# separators: separators: 去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。
# default: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。
# sort_keys: 布尔型,默认为False,如果是字典对象,选择True的话,会按照键的ASCII码来排序
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None, default=None,
sort_keys=False, **kw)
dumps函数不需要传文件描述符,其他的参数和dump函数的一样。
json.load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
# fp: 文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象
# object_hook: 默认值为None,object_hook是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象
# parse_float: 默认值为None,如果指定了parse_float,用来对JSON float字符串进行解码,这可用于为JSON浮点数使用另一种数据类型或解析器
# parse_int: 默认值为None,如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器
# parse_constant:默认值为None,如果指定了parse_constant,对-Infinity,Infinity,NaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常
# 如果进行反序列化(解码)的数据不是一个有效的JSON文档,将会引发 JSONDecodeError异常
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
# s: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象
# encoding: 指定一个编码的格式
loads也不需要文件描述符,其他参数的含义和load函数的一致。
举个例子:
设置ensure_ascii=False来看看效果
# encoding: utf-8
import json
data = {'name': '中文', 'sex': 'male', '年龄': 26}
# 将python字典对象编码成json字符串
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)
print(type(json_str))
# 将json字符串解码为python字典对象
data1 = json.loads(json_str)
print(data1)
print(type(data1))
D:\SoftInstall\Python\Python38\python3.exe E:/PycharmProjects/displayPY3/1.py
{"name": "中文", "sex": "male", "年龄": 26}
<class 'str'>
{'name': '中文', 'sex': 'male', '年龄': 26}
<class 'dict'>
Process finished with exit code 0
可以看到,输出编码后的json字符串,非ASCII码不再被转义(没有前缀"u")
五、dump()、dumps()、load()、loads()区别
1.dump()和dumps()的区别
dump():将python对象序列化为json字符串,并保存到文件中
dumps():将python对象序列化为json字符串
2.load()和loads()的区别
load():将序列化的json字符串从文件读取,并反序列化为python对象
loads():将序列化的json字符串反序列化为python对象
简单来说,dump()/load()多了一个与文件相关的参数,能够与文件操作相结合。
即,dump()是先将python文件对象序列化为json字符串后,再保存在文件中
load()是先从文件中读取已序列化的字符串,再解码成python对象。
参考链接:
https://blog.csdn.net/qq_42233538/article/details/86767629
https://blog.csdn.net/weixin_40636692/article/details/81212304
https://blog.csdn.net/whjkm/article/details/81159888