json序列化(基础及多行数据读写) tcy
发布日期:2021-06-29 14:44:07
浏览次数:3
分类:技术文章
本文共 7647 字,大约阅读时间需要 25 分钟。
json序列化 2020/2/211.1.用途:进行Python对象的序列化和反序列化(str和python数据类型间转换) #在不同编程语言之间传递对象,必须把对象序列化为标准格式,如XML更好JSON #JSON表示出来就是一个字符串,被所有语言Web页读取比XML更快 1.2.方法:json.dump #将Python对象序列化为Json格式的数据流并写入文件json.dumps#将Python对象序列化为Json格式的字符串json.load #从文件中读取Json格式的数据并反序列化成Python对象json.loads#将包含Json格式数据的字符串反序列化成Python对象1.3.序列化Python,Json类型转换关系:Python <---> Jsondict <---> objectlist,tuple<---> arraystr <---> stringint <---> number(int)float <---> number(real)True <---> trueFalse <---> falseNone <---> null
2.实例:#实例2.1:import jsond = dict(name='Bob',age=20,score=88) str1=json.dumps(d) #序列化返回一个str,内容就是标准的JSONprint('str1=',str1) #str1={"age": 20, "score": 88, "name": "Bob"} d2=json.loads(str1) #把JSON的字符串反序列化返回dict类型print('d2=',d2) #d2={'age': 20, 'score': 88, 'name': 'Bob'}
#实例2.2:序列化到文件lst = [11,3.14,'ok','yes'] json.dump(lst,open('test.json','w')) #序列化到文件json.load(open('test.json')) #从文件反序化出来 [11, 3.14, 'ok', 'yes'] with open('test.json', 'w', encoding='utf-8') as f: json.dump(d, f, indent=4)with open('test.json', encoding='utf-8') as f: print(json.load(f)) #{'name': 'Bob', 'age': 20, 'score': 88}
#实例2.3:序列化到文件--多行读写 b1=False;b2=True;str1=' Tom';str2='';x=100;y=123.45;z=float('inf')lst = [11,3.14,'ok',(1,2.12,[33])] d = dict(name='Bob',age=20,score=88,lst=[1,[2,3],4.2])t=((b1,b2,str1,str2,x,y,z,lst,d))with open('res1.json', 'w', encoding='utf-8') as f: json.dump(t, f) f.write('\n') json.dump(t, f)# res.join文件内容:[false, true,... ] with open('res1.json', encoding='utf-8') as f: for line in f: print(json.loads(line))#--------------------------------- with open('res1.json', 'w', encoding='utf-8') as f:#只能是1个dump json.dump(t, f,indent=1)# res.join文件内容:[false,\n true,\n... ]with open('res1.json', encoding='utf-8') as f: print(json.load(f))#[false, true,... ]
#实例2.4:JSON进阶 class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score #Student实例先被student_dict()转成dict后被顺利序列化为Json:def student_dict(std):#应用于__slots__ return {'name': std.name,'age': std.age,'score': std.score} s = Student('Bob', 20, 88)str1=json.dumps(s, default=student_dict)print(str1,type(str1)) #{"age": 20, "name": "Bob", "score": 88},strprint(json.dumps(s, default=lambda obj: obj.__dict__))#dict存储实例变量 #{"name": "Bob", "age": 20, "score": 88}def student_Dict(d): return Student(d['name'], d['age'], d['score']) #运行结果如下:str1 = '{"age": 20, "score": 88, "name": "小明"}' c1= json.loads(str1, object_hook=student_Dict) #反序列化的Student实例对象 print(type(c1),c1.name,c1.age,c1.score) #小明 20 88
3.方法详述json.dumps( obj, #要序列化的Python对象 *, skipkeys=False, #是否跳过字典key不是基本类型数据:True跳过,False抛出TypeError异常 ensure_ascii=True, #字符串中非ascii字符是否进行转义(True转义为unicode) check_circular=True,#是否进行容器类型的循环引用检查 allow_nan=True, #float:'inf','-inf','nan'替代(Infinity,-Infinity,NaN); #False将抛ValueError异常 cls=None, #指定一个定制的JSONEncoder的子类;默认的JSONEncoder indent=None, #格式美化:None无缩进;0只添加\n;>0添加空格 separators=None, #数据间,键值间分隔符 =(’,’, ‘:’) default=None, #指定函数将不可序列化Python对象转可序列化的Python对象 sort_keys=False, #将对象中字典元素按照key进行排序 **kw,)
#实例3.1:dumpsd = {'name': 'bob', b'age': 24} # 包含key为bytes类型的元素json.dumps(d) # skipkeys=False抛出TypeError异常json.dumps(d, skipkeys=True) # '{"name": "bob"}'message = '我爱Python3'json.dumps(message) #'"\\u6211\\u7231Python3"'json.dumps(message, ensure_ascii=False) #'"我爱Python3"'d = {'id': 1, 'dept': 'sales'}d['info'] = d # 字典中包含循环引用json.dumps(d) # 默认循环引用检查引发ValueError异常json.dumps(d, check_circular=False) # 不循环引用检查但在编码时仍引发异常lst = [2, 5, float('inf'), float('-inf'), float('nan')]json.dumps(lst) #'[2, 5, Infinity, -Infinity, NaN]'json.dumps(lst, allow_nan=False) # 引发ValueError异常d = {'name': 'Tom', 'age': 20, 'data': ['NO', 1010]}print(json.dumps(d)) #{"name": "Tom", "age": 20, "data": ["NO", 1010]}print(json.dumps(d, indent=4)) """{ "name": "Tom", "age": 20, "data": [ "NO", 1010 ]}"""
print(json.dumps(d, separators=(';', '!')))#{"name"!"Tom";"age"!20;"data"!["NO";1010]}json.dumps(b'hello') #异常json.dumps(b'hello', default=list) #'[104, 101, 108, 108, 111]'json.dumps(b'hello', default=str) #'"b\'hello\'"'d = {'name': 'Tom', 'age': 23,'gender': 'male'}print(json.dumps(d,sort_keys=True)) #{"age": 23,"gender": "male","name": "Tom"}=======================================================================================class IteratorEncoder(json.encoder.JSONEncoder): def default(self, o): try: iterable = iter(o) except TypeError: pass else: return list(iterable) return super().default(self, o)def get_nums(n): if not isinstance(n, int): raise TypeError('Expected int object') while n > 0: yield n n -= 1print(json.dumps(get_nums(4), cls=IteratorEncoder))#[4, 3, 2, 1]
#实例3.2:loadsjson.loads( s, *, encoding=None, cls=None, #指定一个定制JsonDecoder子类,以实现特定反序列化需求 object_hook=None, #函数,处理解码后生成Python对象dict类型的值;处理是递归进行, #即返回Python对象内部所有字典结构都将被这个方法处理 parse_float=None, #处理解码后的Python对象中的float类型的值 parse_int=None, #接受可调用对象处理解码后的Python对象中的int类型的值 parse_constant=None, #接受函数,解码Infinity、-Infinity、NaN或其他非法Json值处理 object_pairs_hook=None,#为一可调用对象,Json对象被解码成[(key,value),...]顺序一致 **kw,)
d = {'name': 'bob', 'age': 25, 'gender': 'Male'}def obj_hook(Dict): return list(Dict.items()) json.loads(json.dumps(d))#{'name': 'bob', 'age': 25, 'gender': 'Male'}json.loads(json.dumps(d), object_hook=obj_hook) #[('name', 'bob'), ('age', 25), ('gender', 'Male')]lst = [25, d] #[25, {'name': 'bob', 'age': 25, 'gender': 'Male'}]json.loads(json.dumps(lst),object_hook=obj_hook) #[25,[('name','bob'),('age',25),('gender','Male')]]lst = [0, {'name': 'bob', 'age': 20,'d': {'x':1,'y':2}}]json.loads(json.dumps(lst),object_hook=obj_hook) # [0,[('name','bob'),('age',20),('d',[('x',1),('y',2)])]]json.loads('[2,3,4]', parse_float=lambda x:int(x)) #[2, 3, 4]json.loads('[2.5,3.5,4.5]', parse_float=lambda x:float(x))#[2.5,3.5,4.5]json.loads('[2.5,3.5,4.5]', parse_float=lambda x: str(x)) #['2.5','3.5','4.5']json.loads('[2, 3, 4]', parse_int=lambda x: float(x)) #[2.0,3.0,4.0]json.loads('[2, 3, 4]', parse_int=lambda x: int(x)) #[2, 3, 4]json.loads('[2.5, 3.5, 4.5]', parse_int=lambda x: int(x)) #[2.5, 3.5, 4.5]======================================================================================def parse_cons(cons): if cons == 'Infinity': return 'inf' elif cons == '-Infinity': return '-inf' elif cons == 'NaN': return None else: raise Value(f"Can't convert this value {cons}")json.loads('[Infinity,-Infinity,NaN]',parse_constant=parse_cons)#['inf','-inf',None]d = {'name': 'Bob', 'age': 20,'gender': 'male'}json.loads(json.dumps(d), object_pairs_hook=str) #"[('name','Bob'),('age',20),('gender','male')]"from collections import OrderedDictjson.loads(json.dumps(d), object_pairs_hook=OrderedDict) #OrderedDict([('name','Bob'),('age',20),('gender','male')])======================================================================================
转载地址:https://chunyou.blog.csdn.net/article/details/104453013 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月24日 06时57分55秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
网页端数据库操作界面—主题函数文件
2019-04-29
网页端数据库操作界面-Html页面(1)
2019-04-29
网页端数据库操作界面-Html页面(2)
2019-04-29
网页端数据库操作界面-Html页面(3)
2019-04-29
Excel 高级筛选
2019-04-29
Python爬虫 百度热搜热点
2019-04-29
Python 百度热搜 全页面爬取
2019-04-29
爬取小说——爬取书的地址
2019-04-29
爬取小说——爬取章节地址
2019-04-29
爬取小说——爬取标题和正文
2019-04-29
爬取小说——储存为TXT格式
2019-04-29
爬取小说——主体部分
2019-04-29
Python 窗口化操作
2019-04-29
excel的常用函数(二)
2019-04-29
excel的逻辑函数
2019-04-29
excel文本函数
2019-04-29
excel时间日期函数
2019-04-29
excel查找引用函数
2019-04-29
拼多多远程删除用户照片事件
2019-04-29
power BI desktop
2019-04-29