python中json操作之json.loads、json.load、json.jumps及json.jump用法
作者:兰缕启林
前言
经常在Python中对JSON格式的文件进行操作,今天对这些操作做一个总结
首先,需要导入json库import json
0.python类型与json类型互换表
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
什么是json字符串?
相较于JSON对象,JSON字符串(可以理解为一个普通的字符串但拥有特殊的格式 这种格式可以用来转换回JSON对象)可以更加方便的在函数之间传递。
JSON对象中只能使用双引号""
而python对象字典中可以使用单引号''
1.将json字符串转化(反序列化)
(1)json.loads
将JSON字符串转化为 Python 字段的数据类型。
loads:针对内存对象,将string转换为dict (将string转换为dict)
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."""
json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
jsonData='{"\u6d4b\u8bd5": 12345, "\u5185\u5bb9": ["\u6211\u4e5f\u4e0d\u77e5\u9053\u6211\u8981\u5199\u4ec0\u4e48", "123"]}' print(jsonData) print(type(jsonData)) # <class 'str'> 理解为json字符串 py_type_info=json.loads(jsonData) print(py_type_info) print(type(py_type_info)) # <class 'dict'> # 输出: #{"测试": 12345, "内容": ["我也不知道我要写什么", "123"]} # <class 'str'> # {'测试': 12345, '内容': ['我也不知道我要写什么', '123']} # <class 'dict'>
可以从上面输出中看到 JSON 的双引号 与python dict的单引号
(2)json.load
json.load用于读取.json格式的文件,将JSON文件 转化成Python字段的数据类型
load:针对文件句柄,将json格式的字符转换为dict,从文件中读取 (将string转换为dict)
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."""
with open('abc.json','r',encoding='utf-8')as f: py_type_info = json.load(f) print(py_type_info)
with open(os.path.join("/home/output/compare", "cmp{}.json".format(i)), "r", encoding='utf-8') as f: cmpInfo=json.load(f)
延伸:如果.json文件中有注释怎么办
参考资料:Pythonh中用json.load() json.loads()加载json数据的方法
提醒:根据JSON规范(http://www.json.org, RFC 4627, RFC 7159),不支持注释。
但如果真的不幸遇到json文件中有 // 类似的注释如何解决?
def load_json(path): import json lines = [] # 第一步:定义一个列表, 打开文件 with open(path) as f: for row in f.readlines(): # 第二步:读取文件内容 if row.strip().startswith("//"): # 第三步:对每一行进行过滤 continue lines.append(row) # 第四步:将过滤后的行添加到列表中. return json.loads("\n".join(lines)) #将列表中的每个字符串用某一个符号拼接为一整个字符串,用json.loads()函数加载,这样就大功告成啦!!
2.将python对象转化(序列化)
(1)json.dumps
json.dumps 用于将 Python 对象 编码成 JSON 字符串。
注意:这个函数产生的是字符串
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
- obj:转化成json的对象。
- skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key 。
- ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。
- check_circular:如果check_circular为false,则跳过对容器类型的循环引用检查,循环引用将导致溢出错误(或更糟的情况)。
- allow_nan:如果allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)。
- default:default(obj)是一个函数,它应该返回一个可序列化的obj版本或引发类型错误。默认值只会引发类型错误。
- sort_keys =True:是告诉编码器按照字典排序(a到z)输出。如果是字典类型的python对象,就把关键字按照字典排序。
- indent:参数根据数据格式缩进显示,读起来更加清晰。
- separators:是分隔符的意思,参数意思分别为不同dict项之间的分隔符和dict项内key和value之间的分隔符,把:和,后面的空格都除去了。
j1={'测试':12345,'内容':['我也不知道我要写什么','123']} j1_str=json.dumps(j1) print(j1) # 输出:{'测试': 12345, '内容': ['我也不知道我要写什么', '123']}
(2)json.dump
将Python对象编码成JSON文件
j1={'测试':12345,'内容':['我也不知道我要写什么','123']} with open('abc.json','w') as f: json.dump(j1,f)
abc.json中写入了Python对象j1编码出的json格式信息:
{"\u6d4b\u8bd5": 12345, "\u5185\u5bb9": ["\u6211\u4e5f\u4e0d\u77e5\u9053\u6211\u8981\u5199\u4ec0\u4e48", "123"]}
总结
到此这篇关于python中json操作之json.loads、json.load、json.jumps及json.jump用法总结的文章就介绍到这了,更多相关python json操作用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!