json序列化与反序列化概述
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
对比示例:
Python内置的json
模块提供了非常完善的Python对象到JSON格式的转换。我们先看看如何把Python对象变成一个JSON:
序列化示例1:dict(map)
import json list1 = ["小龙女", "王姑娘", "赵灵儿"] # 使用map格式编写数据类型,或者通过dict直接编写数据格式即可 # d = {"msg": "访问成功", "status": True, "result": list1} d = dict(msg="访问成功", status=True, result=list1) info = json.dumps(d) print(info) info = json.loads(info) print(info["msg"]) print(info["status"]) print(info["result"])
从以上的实验中可以看到json序列化与反序列化的过程。
序列化示例2:restful
import json import uuid import time import hashlib class Girl: """用作测试json对象序列化对象""" def __init__(self, id, createDate, userName, passWord, nickName, age, introduce): self.id = id self.createDate = createDate self.userName = userName self.passWord = passWord self.nickName = nickName self.age = age self.introduce = introduce def Girl_json(obj): """用于序列化""" return { "id": obj.id, "createDate": obj.createDate, "userName": obj.userName, "passWord": obj.passWord, "nickName": obj.nickName, "age": obj.age, "introduce": obj.introduce } def GetNow(localTime): """获取当前时间""" return time.strftime("%y-%m-%d %H:%M:%S", localTime) def Md5(obj): """字符串加密""" return hashlib.md5(obj.encode(encoding='utf-8')).hexdigest() g1 = Girl(str(uuid.uuid1()), GetNow(time.localtime()), "wangyuyan", Md5("123456"), "王姑娘", 16, "琅嬛福地,神仙姐姐。") g2 = Girl(str(uuid.uuid1()), GetNow(time.localtime()), "gugu", Md5("123456"), "小龙女", 16, "活死人墓,冰山美人。") g3 = Girl(str(uuid.uuid1()), GetNow(time.localtime()), "linger", Md5("123456"), "赵灵儿", 16, "仙灵岛,人间烟火。") # 序列化: lists = [json.dumps(g1, default=Girl_json), json.dumps(g2, default=Girl_json), json.dumps(g3, default=Girl_json)] result = dict(status="success", msg="访问成功", result=lists) info = json.dumps(result) print("序列化:") print(info) print("\n-------------------------------------\n") print("第一层反序列化") load = json.loads(info) print(load["status"]) print(load["msg"]) print(load["result"]) print("\n-------------------------------------\n") print("第二层反序列化") def handle(obj): """反序列化""" return Girl( obj["id"], obj["createDate"], obj["userName"], obj["passWord"], obj["nickName"], obj["age"], obj["introduce"]) for g in load["result"]: girl = json.loads(g, object_hook=handle) print(girl.id) print(girl.createDate) print(girl.userName) print(girl.passWord) print(girl.nickName) print(girl.age) print(girl.introduce)
备注:
json.dumps()函数的详细说明
help(json.dumps):
Help on function dumps in module json:
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding='utf-8', default=None, sort_keys=False, **kw)
# 函数作用: 将Python的对象转变成JSON对象
# skipkeys: 如果为True的话,则只能是字典对象,否则会TypeError错误, 默认False
# ensure_ascii: 确定是否为ASCII编码
# check_circular: 循环类型检查,如果为True的话
# allow_nan: 确定是否为允许的值
# indent: 会以美观的方式来打印,呈现
# separators: 对象分隔符,默认为,
# encoding: 编码方式,默认为utf-8
# sort_keys: 如果是字典对象,选择True的话,会按照键的ASCII码来排序