处理json
Posted 羽竹
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理json相关的知识,希望对你有一定的参考价值。
说明:
#json是一种通用的数据类型,所有的语言都认识。
#k - v {}
#json串就是一个字符串,不能根据key-value取值
#json可以转成字典
#json串就是字符串,可放在三引号中
校验json格式的网址:http://www.bejson.com/
那么json怎么转成字典,用到模块json,可以import json
一、JSON 函数
1、json.dumps:字典转成json串(字符串)
json.dumps(stus,indent=8,ensure_ascii=False) #将字典转成json字符串 ;indent 控制几个缩进的;当字典中有中文的时候,需要写ensure_ascii=False,不然json串里面不显示汉字。
2、json.loads:将json串转成字典
1)字典和json互相转换:
import json #导入json模块 s = ‘‘‘ { "error_code": 0, "stu_info": [ { "id": 309, "name": "小白", "sex": "男", "age": 28, "addr": "河南省济源市北海大道32号", "grade": "天蝎座", "phone": "18512572946", "gold": 100 }, { "id": 310, "name": "小白", "sex": "男", "age": 28, "addr": "河南省济源市北海大道32号", "grade": "天蝎座", "phone": "18516572946", "gold": 100 } ] } ‘‘‘ res = json.loads(s) #将json串转成字典 print(res) print(type(res)) stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘} #一个字典 res2 = json.dumps(stus) #将字典转成json串 print(res2) print(type(res2))
2)字典转成json串,然后写入文件
stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘,‘海龙‘:‘34535‘} #一个字典 res2 = json.dumps(stus,indent=8,ensure_ascii=False) #将字典转成json串 print(res2) print(type(res2)) with open(‘stus.json‘,‘w‘,encoding=‘utf-8‘) as f: #文件的后缀.json,这样文件里面显示的好看,有颜色区分。后缀无所谓 f.write(res2)
文件中看-实际带有颜色:
{ "xiaohei": "345346", "海龙": "34535", "xiaojun": "123456" }
3)从文件中读取json串,转成字典
with open(‘stus.json‘,‘r‘,encoding=‘utf-8‘)as f: content = f.read() #返回字符串 user_dict = json.loads(content) #将json字符串转成字典 print(user_dict)
3、json.load()与json.loads()的区别
两个方法功能类似,可选参数也相同,最大的区别在于,json.load方法接受的输入,即第一个参数,是包含json数据的文件对象,如open方法的返回对象。
json.loads接受的输入是json字符串,而非文件对象。
如果说你要操作文件,可以直接用json.load
举例:
json.loads()将文件中的json转成字典如下:
with open(‘stus.json‘,‘r‘,encoding=‘utf-8‘)as f: content = f.read() #返回字符串 user_dict = json.loads(content) #json.loads接受的是字符串content print(user_dict)
json.load()将文件中的json转成字典如下:
with open(‘stus.json‘,‘r‘,encoding=‘utf-8‘)as f: user_dic = json.load(f) #json.load接受的是文件对象 print(user_dic)
4、json.dump()和json.dumps()区别
dump()第一个参数时字典对象,第二个参数是文件对象,可以直接将转换后的json数据写入文件;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排序。
将字典转成json串写入文件操作:
json.dumps()方式
stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘,‘海龙‘:‘34535‘} f = open(‘stus.json‘,‘w‘,encoding=‘utf-8‘) res = json.dumps(stus,indent=8,ensure_ascii=False) #转换成json串 f.write(res) #写入文件
json.dump()方式:
stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘,‘海龙‘:‘34535‘} f = open(‘stus.json‘,‘w‘,encoding=‘utf-8‘) json.dump(stus,f,indent=8,ensure_ascii=False) #json.dump第一个参数字典(stus),第二个参数文件对象(f),这个不需要再写入操作了,直接就写进去了
以上:当你要把字典写到文件里面,用dump比较好用。如果你不操作文件,想存到数据库里面,不能用dump,还得用dumps.
不带s都跟文件相关,带s的都跟字符串相关。
问题:应用json.load/loads/dump/dumps方法时,文件中的内容如果不是json格式会抛异常如下。
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
原因:文件中不是json格式,可用http://www.bejson.com/查询是不是json格式,其中:文件是空的不是json格式,1也是json格式,{}是json格式
如果起初文件就是空的,可以写个{}这样就能正确解析json串了
以上是关于处理json的主要内容,如果未能解决你的问题,请参考以下文章