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 |
最新文章
- jQuery获取输入框并设置焦点
- Apache Shiro系列二,概述 —— 基本概念
- mvc模型验证
- unix的策略与机制
- hdu 4607 Park Visit(树上最长链)
- 获取Ip 的地域等信息接口-实例
- poj2954
- Ecstore后台中显示页面display,page,singlepage方法的区别?
- 吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
- hdu4753
- saiku中过滤窗口优化及隐藏异常报错
- Android开发之简单的电子相册实现
- A - 小Y上学记——修学分
- 新CCIE笔记之'口口相传'路由协议
- 硬盘安装Kali
- 如何升级centos到最新版本
- Java基础_0310:引用传递
- yum源更换为本地光盘
- 51nod 1132 覆盖数字的数量 V2
- Android中常见的对话框