zoukankan      html  css  js  c++  java
  • 序列化与反序列化

     在python的标准库中,专门提供了json库与pickle库来处理这部分

    import  json
    
    dict1={'name':'wuya','age':22,'address':'xian'}
    
    print u'未序列化前的数据类型为:',type(dict1)
    print u'未序列化前的数据:',dict1
    #对dict1进行序列化的处理
    str1=json.dumps(dict1)
    print u'序列化后的数据类型为:',type(str1)
    print u'序列化后的数据为:',str1
    ------------------------------------------------------
    未序列化前的数据类型为: <type 'dict'>
    未序列化前的数据: {'age'22'name''wuya''address''xian'}
    序列化后的数据类型为: <type 'str'>
    序列化后的数据为: {"age"22"name""wuya""address""xian"}
     
     

    通过如上的代码以及结果可以看到,这就是一个序列化的过程,简单的说就是把python的数据类型转换为json格式的

    字符串。下来我们再反序列化,把json格式的字符串解码为python的数据对象,见实现的代码和输出:

    import  json
    
    dict1={'name':'wuya','age':22,'address':'xian'}
    
    print u'未序列化前的数据类型为:',type(dict1)
    print u'未序列化前的数据:',dict1
    #对dict1进行序列化的处理
    str1=json.dumps(dict1)
    print u'序列化后的数据类型为:',type(str1)
    print u'序列化后的数据为:',str1
    #对str1进行反序列化
    dict2=json.loads(str1)
    print u'反序列化后的数据类型:',type(dict2)
    print u'反序列化后的数据:',dict2
    ------------------------------------------------------------
    未序列化前的数据类型为: <type 'dict'>
    未序列化前的数据: {'age': 22, 'name': 'wuya', 'address': 'xian'}
    序列化后的数据类型为: <type 'str'>
    序列化后的数据为: {"age": 22, "name": "wuya", "address": "xian"}
    反序列化后的数据类型: <type 'dict'>
    反序列化后的数据: {u'age': 22, u'name': u'wuya', u'address': u'xian'}
    -----------------------------------------------------------------------------------
    比较特殊的一个
    元组的序列化和反序列化
    import json
    aa=(1,2,3)
    tty=json.dumps(aa)
    print(tty,type(tty))
    pp=json.loads(tty)
    print(pp,type(pp))
    
    

    [1, 2, 3] <class 'str'>
    [1, 2, 3] <class 'list'>

    元组反序列化之后是一个list

    ------------------------------------------------------------------------------
    下面我们结合requests库,来看返回的json数据,具体代码为:
    import  json
    import  requests
    
    r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
    
    print r.text,u'数据类型:',type(r.text)
    #对数据进行反序列化的操作
    dic=json.loads(r.text)
    print dic,u'数据类型:',type(dic)
    ---------------
    {"desc":"OK","status":1000,"data":{"wendu":"3","ganmao":"昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。","forecast":[{"fengxiang":"东北风","fengli":"微风级","high":"高温 10℃","type":"晴","low":"低温 -2℃","date":"22日星期四"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 8℃","type":"多云","low":"低温 0℃","date":"23日星期五"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 7℃","type":"阴","low":"低温 0℃","date":"24日星期六"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 1℃","type":"雨夹雪","low":"低温 -1℃","date":"25日星期天"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 5℃","type":"多云","low":"低温 1℃","date":"26日星期一"}],"yesterday":{"fl":"微风","fx":"北风","high":"高温 7℃","type":"阴","low":"低温 -1℃","date":"21日星期三"},"aqi":"87","city":"西安"}} 数据类型: <type 'unicode'>
    {u'status': 1000, u'data': {u'city': u'u897fu5b89', u'yesterday': {u'fx': u'u5317u98ce', u'type': u'u9634', u'high': u'u9ad8u6e29 7u2103', u'low': u'u4f4eu6e29 -1u2103', u'date': u'21u65e5u661fu671fu4e09', u'fl': u'u5faeu98ce'}, u'forecast': [{u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 10u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'22u65e5u661fu671fu56db', u'type': u'u6674', u'low': u'u4f4eu6e29 -2u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 8u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'23u65e5u661fu671fu4e94', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 7u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'24u65e5u661fu671fu516d', u'type': u'u9634', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 1u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'25u65e5u661fu671fu5929', u'type': u'u96e8u5939u96ea', u'low': u'u4f4eu6e29 -1u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 5u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'26u65e5u661fu671fu4e00', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 1u2103'}], u'ganmao': u'u663cu591cu6e29u5deeu8f83u5927uff0cu8f83u6613u53d1u751fu611fu5192uff0cu8bf7u9002u5f53u589eu51cfu8863u670du3002u4f53u8d28u8f83u5f31u7684u670bu53cbu8bf7u6ce8u610fu9632u62a4u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 
    数据类型: <type 'dict'>


    事实上,在如上的代码中,我们可以不通过反序列化的操作,代码可以简化为:
    import  json
    import  requests
    
    r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
    print r.json(),u'数据类型为:',type(r.json())

    {u'status': 1000, u'data': {u'city': u'u897fu5b89', u'yesterday': {u'fx': u'u5317u98ce', u'type': u'u9634', u'high': u'u9ad8u6e29 7u2103', u'low': u'u4f4eu6e29 -1u2103', u'date': u'21u65e5u661fu671fu4e09', u'fl': u'u5faeu98ce'}, u'forecast': [{u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 10u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'22u65e5u661fu671fu56db', u'type': u'u6674', u'low': u'u4f4eu6e29 -2u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 8u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'23u65e5u661fu671fu4e94', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 7u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'24u65e5u661fu671fu516d', u'type': u'u9634', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 1u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'25u65e5u661fu671fu5929', u'type': u'u96e8u5939u96ea', u'low': u'u4f4eu6e29 -1u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 5u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'26u65e5u661fu671fu4e00', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 1u2103'}], u'ganmao': u'u663cu591cu6e29u5deeu8f83u5927uff0cu8f83u6613u53d1u751fu611fu5192uff0cu8bf7u9002u5f53u589eu51cfu8863u670du3002u4f53u8d28u8f83u5f31u7684u670bu53cbu8bf7u6ce8u610fu9632u62a4u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 数据类型为: <type 'dict'>
     

    在实际的工作中,序列化或者反序列化的可能是一个文件的形式,不可能像如上写的那样简单的,下来就来实现这部分,把文件内容

    进行序列化和反序列化,先来看序列化的代码

    import  json
    
    list1=['selenium','appium','android','ios','uiautomator']
    #把list1先序列化,再写入到一个文件中
    print json.dump(list1,open('c:/log.log','w'))
    print u'文件内容为:'
    r=open('c:/log.log','r+')
    print r.read()

    文件内容为:
    ["selenium", "appium", "android", "ios", "uiautomator"]

    下面我们来反序列化,也就是先读取文件里面的内容,再进行反序列化,见实现的代码:

    import  json
    list1=['selenium','appium','android','ios','uiautomator']
    #把list1先序列化,再写入到一个文件中
    print json.dump(list1,open('c:/log.log','w'))
    print u'文件内容为:'
    r=open('c:/log.log','r+')
    print r.read()
    #先读取文件内容,再进行反序列化
    res=json.load(open('c:/log.log','r+'))
    print res,u'数据类型:',type(res)
    ----------------------------------------------------------------------
    ["selenium", "appium", "android", "ios", "uiautomator"]
    [u'selenium', u'appium', u'android', u'ios', u'uiautomator'] 数据类型: <type 'list'>
    

     在实际项目中

    1、接口在发请求时,参数是字符串类型,所以一般需要字典类型或者其他类型-先序列化未字符串类型

    2、接口返回的数据可能是Unicode 编码,需要转化为字符串类型, 在使用反序列化-变成字典类型或者其他类型---然后在取值

    文件序列化反序列化

    在这个案例中,并不是所有的项目

    1、文件反序列化后,是Unicode

    2、进行编码,把Unicode类型转为str类型

    3、然后使用反序列化,把str类型转化为字典类型

     
     





     
  • 相关阅读:
    LAMP 环境搭建备忘 -- Linux的安装(一)
    Qt 的一些浅知识点
    chm 转 txt
    SQL 语句 (二) --- SELECT
    SQL语句 (一)
    量子电路
    量子隐形传态 Quantum Teleportation
    量子逻辑门
    量子纠缠2——CHSH不等式
    量子纠缠1——量子比特、Bell态、EPR佯谬
  • 原文地址:https://www.cnblogs.com/fkkk/p/9933222.html
Copyright © 2011-2022 走看看