客户端和服务端之间需要交换数据才能完成各种功能。
假设 服务端程序都是用Python语言开发的话,那么
服务端从数据库中获取的最近的交易列表,可能就是像下面这样的一个Python列表对象:
historyTransactions = [
{
'time' : '20170101070311', # 交易时间
'amount' : '3088', # 交易金额
'productid' : '45454455555', # 货号
'productname' : 'iphone7' # 货名
},
{
'time' : '20170101050311', # 交易时间
'amount' : '18', # 交易金额
'productid' : '453455772955', # 货号
'productname' : '奥妙洗衣液' # 货名
},
...
]
我们怎样把存在于内存中的数据对象传递给客户端呢?
通常,我们把程序的各种类型的数据对象变成表示该数据对象的字节串,这个过程称之为序列化。
而把字节串转化为程序中的数据对象,这个过程称之为反序列化。
通常我们的传输协议(通常是http协议)传送信息,传输的都是序列化好的字节串。
而不同的客户端、服务端程序可能使用不同的语言。为了方便不同的编程语言的处理,这个序列化的格式应该是各种语言都方便处理的。
XML的一个弊端就是 序列化性能相对比较低, 而且转化后的数据体积增大很多。
最近的主流方案就是JSON。
JSON(Javascript Object Notation, JS对象标识) 是一种轻量级的数据交换格式。
它是Javascript规范里面定义的,它是一种文本格式来存储和表示数据。
它的特点是简洁并且清晰,人都能很容易地看明白。
也方便程序的解析和生成。
任何编程语言都可以使用这种格式。而且很多编程语言的解释器都内置了库,可以很方便地进行序列化和反序列化。包括Python和javascript等。
序列化和反序列化:
Python中内置了json这个库,可以 方便的把内置的数据对象 序列化为json格式文本的字符串。
import json
historyTransactions = [
{
'time': '20170101070311', # 交易时间
'amount': '3088', # 交易金额
'productid': '45454455555', # 货号
'productname': 'iphone7' # 货名
},
{
'time': '20170101050311', # 交易时间
'amount': '18', # 交易金额
'productid': '453455772955', # 货号
'productname': '奥妙洗衣液' # 货名
}
]
# dumps()方法将数据对象序列化为json格式的字符串
jsonstr = json.dumps(historyTransactions)
# 打印json格式的字符串
print(jsonstr)
执行结果:
C:\Users\changchunhua\AppData\Local\Programs\Python\Python311\python.exe D:\PythonCode\chang\my.py
[{"time": "20170101070311", "amount": "3088", "productid": "45454455555", "productname": "iphone7"}, {"time": "20170101050311", "amount": "18", "productid": "453455772955", "productname": "\u5965\u5999\u6d17\u8863\u6db2"}]
Process finished with exit code 0
当然有些不同,比如字符串只能用双引号,列表最后一个元素后面不能有逗号等。
序列化后的结果,也是一个!!!字符串。 json格式本身就是一个字符串。
然后我们可以存储到文件,或者从网络发送出去。
这样就完成了数据对象的发送。
因为网络中是无法直接传输你内存中的数据对象的。
json.dumps方法中发现字符串如果有非ascii码字符,缺省的就用该字符的unicode数字来表示。
import json
historyTransactions = [
{
'time': '20170101070311', # 交易时间
'amount': '3088', # 交易金额
'productid': '45454455555', # 货号
'productname': 'iphone7' # 货名
},
{
'time': '20170101050311', # 交易时间
'amount': '18', # 交易金额
'productid': '453455772955', # 货号
'productname': '奥妙洗衣液' # 货名
}
]
# dumps()方法将数据对象序列化为json格式的字符串
jsonstr = json.dumps(historyTransactions, ensure_ascii=False, indent=4)
# 打印json格式的字符串
print(jsonstr)
执行结果:
C:\Users\changchunhua\AppData\Local\Programs\Python\Python311\python.exe D:\PythonCode\chang\my.py
[
{
"time": "20170101070311",
"amount": "3088",
"productid": "45454455555",
"productname": "iphone7"
},
{
"time": "20170101050311",
"amount": "18",
"productid": "453455772955",
"productname": "奥妙洗衣液"
}
]
Process finished with exit code 0
接收方如果也是Python开发的,可以使用json库中的loads方法。把json格式的字符串变成Python中的数据对象。
import json
historyTransactions = [
{
'time': '20170101070311', # 交易时间
'amount': '3088', # 交易金额
'productid': '45454455555', # 货号
'productname': 'iphone7' # 货名
},
{
'time': '20170101050311', # 交易时间
'amount': '18', # 交易金额
'productid': '453455772955', # 货号
'productname': '奥妙洗衣液' # 货名
}
]
# dumps()方法将数据对象序列化为json格式的字符串
jsonstr = json.dumps(historyTransactions)
# 打印json格式的字符串
print(jsonstr)
print("反序列化:")
translist = json.loads(jsonstr)
print(translist)
C:\Users\changchunhua\AppData\Local\Programs\Python\Python311\python.exe D:\PythonCode\chang\my.py
[{"time": "20170101070311", "amount": "3088", "productid": "45454455555", "productname": "iphone7"}, {"time": "20170101050311", "amount": "18", "productid": "453455772955", "productname": "\u5965\u5999\u6d17\u8863\u6db2"}]
反序列化:
[{'time': '20170101070311', 'amount': '3088', 'productid': '45454455555', 'productname': 'iphone7'}, {'time': '20170101050311', 'amount': '18', 'productid': '453455772955', 'productname': '奥妙洗衣液'}]
Process finished with exit code 0
我们看下:
发序列化后,是一个列表对象。然后程序就是列表操作了,应该是非常简单的。
Python中的数据对象,是单引号。然后也变成了中文。