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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python删除指定文件夹下指定扩展名的文件(按日期排序,保留不删除的文件数量)(tcy)
下一篇:notepad++配置 tcy

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月24日 06时57分55秒