zoukankan      html  css  js  c++  java
  • python json模块小技巧

    python的json模块通常用于与序列化数据,如

    def get_user_info(user_id):
    	res = {"user_id": 190013234,"nick": "havana"}
    	json_str = json.dumps(res)
        return json_str
    

    但是当要序列化的数据里面包含中文字符时,会变成这样

    import json
    res = {"user_id": 190027134, "nick": "愚蠢的萝卜"}
    print(json.dumps(res))
    
    # {"nick": "u611au8822u7684u841du535c", "user_id": 190027134}
    

    解决办法: 在json.dumps()里面加入一个参数ensure_ascii=False

    import json
    res = {"user_id": 190027134, "nick": "愚蠢的萝卜"}
    print(json.dumps(res))
    
    # {"nick": "愚蠢的萝卜", "user_id": 190027134}
    

    这里有一个问题,如果json的结构很复杂,输出的结果就会很乱,不清晰,这是可以加入一个参数使其格式化

    import json
    res = {"user_id": 190027134, "nick": "愚蠢的萝卜"}
    print(json.dumps(res))
    
    # {
        "nick": "愚蠢的萝卜", 
        "user_id": 190027134
    }
    

    如果序列化的数据里面有python的datetime.datetime类型,那么序列化会报错

    import datetime
    
    res = {"user_id": 190027134, "nick": "愚蠢的萝卜", "reg_ts": datetime.datetime.now()}
    print(json.dumps(res, ensure_ascii=False, indent=4))
    
    #TypeError: datetime.datetime(2019, 11, 3, 19, 8, 45, 987000) is not JSON serializable
    

    解决办法是使用自定义的jsonencoder代替原生的jsonencoder

    class DatetimeEncoder(json.JSONEncoder):
    
        def default(self, obj):
            if isinstance(obj, datetime.datetime):
                return obj.strftime('%Y-%m-%d %H:%M:%S')
            elif isinstance(obj, datetime.date):
                return obj.strftime('%Y-%m-%d')
            else:
                return json.JSONEncoder.default(self, obj)
    
    
    res = {"user_id": 190027134, "nick": "愚蠢的萝卜", "reg_ts": datetime.datetime.now(), "last_login_date": datetime.date.today()}
    print(json.dumps(res, ensure_ascii=False, indent=4, cls=DatetimeEncoder))
    
    # {
        "nick": "愚蠢的萝卜", 
        "user_id": 190027134, 
        "reg_ts": "2019-11-03 20:09:55", 
        "last_login_date": "2019-11-03"
    }
    
  • 相关阅读:
    mysql 设置密码
    linux 下如何抓取HTTP流量包(httpry)
    m2a-vm超频的方法
    生产服务器环境最小化安装后 Centos 6.5优化配置备忘
    CentOS关闭休眠和屏保模式
    微信公众平台开发教程第2篇-----微信开发者接入
    微信公众平台开发教程第1篇-新手解惑
    android 文件读取(assets、raw)
    员工培训的七大误区和三个内核价值
    从业务专家进阶到管理者
  • 原文地址:https://www.cnblogs.com/zzliu/p/11788823.html
Copyright © 2011-2022 走看看