Python学习基础笔记七十七——json序列化

客户端和服务端之间需要交换数据才能完成各种功能。

假设 服务端程序都是用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中的数据对象,是单引号。然后也变成了中文。

你可能感兴趣的:(Python,python)