Python常用模块之json模块
常用模块:
一个Python文件就是一个模块
import xxx
1. 标准模块,Python自带的,如time/random
2. 第三方模块,如连接mysql,需要安装
3. 自己写的Python文件
校验json格式是否正确:www.bejson.com
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,其最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式。json类似于xml,但比 XML 更小、更快,更易解析。
一、json字符串转为字典
json.load / json.loads
两个方法功能类似,可选参数也相同,最大的区别在于,json.load方法接受的输入,即第一个参数,是包含json数据的文件对象,如open方法的返回对象,
json.loads接受的输入是json字符串,而非文件对象。从输入类型的区别也可以看出两者的使用场合。
def 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):
# Serialize ``obj`` to a JSON formatted ``str``.
# 序列号 “obj” 数据类型 转换为 JSON格式的字符串
def 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):
"""Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object).
我理解为两个动作,一个动作是将”obj“转换为JSON格式的字符串,还有一个动作是将字符串写入到文件中,也就是说文件描述符fp是必须要的参数 """
1. json.loads : 将json编码的字符串转换为python的数据结构
import json
json_str = ''' {"name":"xiaohei","age":18,"sex":"男","age":18} ''' res = json.loads(json_str) #把字符串(json串)转成字典 print(res) print(type(json_str)) print(type(res)) #以上输出如下: # {'name': 'xiaohei', 'age': 18, 'sex': '男'} # <class 'str'> # <class 'dict'>
2. json.load : 从数据文件中读取数据,并将json编码的字符串转换为python的数据结构,load可以自己读文件
import json with open('text.json','r',encoding='utf-8') as fr: aa = json.loads(fr.read()) fr.seek(0) bb = json.load(fr)# json.load(fr)和json.loads(fr.read()) 返回结果一样,load可以自己去读文件 print(aa) print(bb) #输出 # {'name': '小黑', 'age': 18, 'sex': '男'} # {'name': '小黑', 'age': 18, 'sex': '男'}
二、字典转换为json
json.dump / json.dumps
对应于load和loads,dump的第一个参数是对象字典,第二个参数是文件对象,可以直接将转换后的json数据写入文件,dumps的第一个参数是对象字典,其余都是可选参数。dump和dumps的可选参数相同,这些参数都相当实用,现将用到的参数记录如下:
ensure_ascii 默认为True,保证转换后的json字符串中全部是ascii字符,非ascii字符都会被转义。如果数据中存在中文或其他非ascii字符,最好将ensure_ascii设置为False,保证输出结果正常。
indent 缩进,默认为None,没有缩进,设置为正整数时,输出的格式将按照indent指定的半角空格数缩进,相当实用。
separators 设置分隔符,默认的分隔符是(',', ': '),如果需要自定义json中的分隔符,例如调整冒号前后的空格数,可以按照(item_separator, key_separator)的形式设置。
sort_keys 默认为False,设为True时,输出结果将按照字典中的key排序。
查看源码:
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object.
将包含str类型的JSON文档反序列化为一个python对象"""
def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object.
将一个包含JSON格式数据的可读文件饭序列化为一个python对象"""
1. json.dumps: 将数据通过特殊的形式转换为所有程序语言都认识的字符串
import json dic = { "xiaohei":{ "age":18, "password":12345, "sex":"男", "addr":"北京" }, "马春波":{ "age":18, "password":12345, "sex":"男", "addr":"北京" }, "王东泽":{ "age":18, "password":12345, "sex":"男", "addr":"北京" }, } res = json.dumps(dic,ensure_ascii=False,indent=4)#把字典变成字符串 print(res) f = open('user.json','w',encoding='utf-8') f.write(res) #写入文件 #输出: { "xiaohei": { "age": 18, "password": 12345, "sex": "男", "addr": "北京" }, "马春波": { "age": 18, "password": 12345, "sex": "男", "addr": "北京" }, "王东泽": { "age": 18, "password": 12345, "sex": "男", "addr": "北京" } }
2. json.dump:将数据通过特殊的形式转换为所有程序语言都认识的字符串,并写入文件
import json dic = { "xiaohei":{ "age":18, "password":12345, "sex":"男", "addr":"北京" }, "小白":{ "age":18, "password":12345, "sex":"男", "addr":"北京" }, "小王":{ "age":18, "password":12345, "sex":"男", "addr":"北京" }, } fw = open('newuser.json','w',encoding='utf-8')#打开一个新的文件 aa = json.dump(dic,fw,indent=4,ensure_ascii=False)#将字典写到该文件中 print(aa)
三、 总结
1. json序列化方法:
dumps:无文件操作 dump:序列化+写入文件
2. json反序列化方法:
loads:无文件操作 load: 读文件+反序列化
3.
python 原始类型向 json 类型的转化对照表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
4. json 类型转换到 python 的类型对照表:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |