json模塊
JSON全稱是(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)格式,一般用于前后臺,數(shù)據(jù)的交互。
JSON:輕量級的數(shù)據(jù)交互格式,它實際在傳輸?shù)臅r候都是字符串
JSON:一種交互的格式,所有的語言基本上都有字符串,可以傳遞
js對象:是一種js數(shù)據(jù)類型,是js特有的,無法傳遞交互數(shù)據(jù)
JSON語法規(guī)則:
- 數(shù)據(jù)由鍵值對組成;
- 鍵值對由逗號分隔;
- 大括號里保存對象;
- 中括號里保存數(shù)組;
注意事項:
1.json數(shù)據(jù)格式的屬性(鍵和字符串)的值都為雙引號(" ");
2.值:整數(shù)、浮點數(shù)(小數(shù))、字符串、布爾、數(shù)組、對象(除了undefined/NaN)
| python對象 | json對象 |
|---|---|
| dict | object |
| list, tuple | array |
| str | string |
| int, float | number |
| None | null |
| True/False | true/fase |
JSON用js定義:
- JSON:一種交互的格式,所有的語言基本上都有字符串,可以傳遞;
- js對象:是一種js數(shù)據(jù)類型,是js特有的,無法傳遞交互數(shù)據(jù);
很多人搞不清楚 JSON 和 Js 對象的關(guān)系,甚至連誰是誰都不清楚。其實,可以這么理解:
JSON 是 JS 對象的字符串表示法,它使用文本表示一個 JS 對象的信息,本質(zhì)是一個字符串。
如
var obj = {a: 'Hello', b: 'World'}; //這是一個對象,注意鍵名也是可以使用引號包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質(zhì)是一個字符串
JSON 和 JS 對象互轉(zhuǎn)
要實現(xiàn)從對象轉(zhuǎn)換為 JSON 字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //結(jié)果是 '{"a": "Hello", "b": "World"}'
要實現(xiàn)從 JSON 轉(zhuǎn)換為對象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //結(jié)果是 {a: 'Hello', b: 'World'}
-
目前互聯(lián)網(wǎng)開發(fā)前后端數(shù)據(jù)交互使用的基本都是json
image.png
Json模塊API
在使用之前 我們要了解兩個名字 序列化和反序列化:
- 序列化: 把一個Python對象轉(zhuǎn)化成json字符串
- 反序列化: 把json字符串轉(zhuǎn)化成python
import json
print(json.__all__)
data = {
'name':'小白',
'age':18,
'sex':'man'
}
#json.dumps(obj) 序列化,把一個Python對象轉(zhuǎn)化成json字符串
print(type(json.dumps(data)), json.dumps(data)) # str==>{"name": "\u5c0f\u767d", "age": 18, "sex": "man"}
#ensure_ascii是False的時候,可以返回非ASCII碼的值,否則就會被JSON轉(zhuǎn)義。
# 所以含有中文的字典轉(zhuǎn)json字符串時,要把ensure_ascii參數(shù)改成false
print(json.dumps(data, ensure_ascii=False)) # {"sex": "man", "name": "小白", "age": 18}
#indent進行數(shù)據(jù)格式化輸出
print(json.dumps(data, ensure_ascii=False, indent=4))
data_str = '{"name": "小白", "age": 18, "sex": "man"}'
#json.loads(str) 反序列化: 把json字符串轉(zhuǎn)化成python對象
print(type(json.loads(data_str)), json.loads(data_str)) #<class 'dict'> {'name': '小白', 'sex': 'man', 'age': 18}
#json.dump(obj,fp), python對象轉(zhuǎn)化為json并保存到文件中
with open('test.json', 'w') as f:
json.dump(data, f)
#json.load(fp) 從文件中讀取json,并轉(zhuǎn)化python對象
with open('test.json', 'r') as f:
data = json.load(f)
print(data)
print(type(data))
print(type(json.dumps([1,2,3,4])), json.dumps([1,2,3,4,'test'])) #<class 'str'> [1, 2, 3, 4, "test"]
print(type(json.loads('[1,2,3,4]')), json.loads('[1,2,3,4]')) #<class 'list'> [1, 2, 3, 4]
hashlib模塊
數(shù)據(jù)安全

- 對稱加密:數(shù)據(jù)加密解密使用相同的密鑰;
- 非對稱加密:加密和解密用兩把不同的密鑰, 公鑰用于加密數(shù)據(jù),私鑰用于解密數(shù)據(jù);
- 單向加密:只能加密數(shù)據(jù),而不能解密數(shù)據(jù);
HASH

特點
- 不可逆:無法根據(jù)散列值來還原原來的數(shù)據(jù);
- 定長輸出:無論輸入的原始數(shù)據(jù)有多長,結(jié)果長度是相同的;
- 坑修改性:輸入的微小改變,哪怕只有一個字符,會引起結(jié)果的巨大改變;
- 強碰撞性:很難找到兩段內(nèi)容不同的數(shù)據(jù),使他們產(chǎn)生的hash值一致,幾乎不可能;
hashlib模塊API
Hashlib模塊提供了許多供我們調(diào)用的hash算法,主要有:
1.md5
2.SHA系列:sha1, sha224, sha256, sha384, sha512
| api | 描述 |
|---|---|
| hashlib.new(name, data=b”) | 生成一個hash對象 |
| hashlib.hash算法名(data=b”) | 生成一個使用該算法的hash對象 |
| hashlib.update(arg=None) | 更新hash對象 |
| hash.digest() | 返回Hash算法計算得到的值(bytes類型) |
| hash.hexdigest() | 返回Hash算法計算得到的值(str類型) |
import hashlib
data = '機密信息'
#加密解碼的數(shù)據(jù)都要是bytes類型
hash = hashlib.md5(data.encode()) #參數(shù)一定要是bytes類型的 生成一個hash對象
print(type(hash), hash) #<class '_hashlib.HASH'> <md5 HASH object @ 0xb7229098>
hash.update('12'.encode()) #把12和前面數(shù)據(jù)組合起來加密
print(hash.hexdigest()) #返回Hash算法計算得到的值(str類型) 44b14ea98ba191e520b3b8d96397ad3a
base64模塊(url編碼)

特點
用來將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法
常用于對URL的編碼
可以將不可打印的二進制數(shù)據(jù)轉(zhuǎn)化為可打印的字符串
base64模塊API
Base64編碼后的數(shù)據(jù)可能會含有 + / 兩個符號,如果編碼后的數(shù)據(jù)用于URL或文件的系統(tǒng)路徑中,就可能導致Bug,所以base模塊提供了專門編碼url的方法。
| api | 描述 |
|---|---|
| base64.b64encode(s) | 對二進制數(shù)據(jù)進行base64編碼 |
| base64.b64decode(s) | 對通過base64編碼的數(shù)據(jù)進行解碼 |
| base64.urlsafe_b64encode(s) | 對URL進行base64編碼 |
| base64.urlsafe_b64decode(s) | 解碼 |
import base64
data = '菜鳥小白'
#加密解碼的數(shù)據(jù)都要是bytes類型
data_encode = base64.b64encode(data.encode()) #進行base64編碼
print(data_encode) #b'6I+c6bif5bCP55m9'
result = base64.b64decode(data_encode) #進行base64解碼
print(result) #b'\xe8\x8f\x9c\xe9\xb8\x9f\xe5\xb0\x8f\xe7\x99\xbd'
print(result.decode()) #菜鳥小白 將bytes解碼成字符串
url = 'http://www.python.org'
data_encode = base64.urlsafe_b64encode(url.encode())
print(data_encode) #b'aHR0cDovL3d3dy5weXRob24ub3Jn'
result = base64.urlsafe_b64decode(data_encode)
print(result) #b'http://www.python.org'
print(result.decode()) #http://www.python.org
練習
1、data = { "name": "juhao", "age": 18, "feature" : [" 高 ", " 富 ", " 帥 "] }在程序中將這個字典轉(zhuǎn)化為 json 并存入文件內(nèi), 然后再從 這個文件中讀取出‘帥’這個字符打印出來。
import json
data = {"name": "juhao", "age": 18, "feature": [" 高 ", " 富 ", " 帥 "]}
f = open('test.json', 'w+') #可讀寫
json.dump(data, f)
f.seek(0,0) #指針回到文件開頭
result = json.load(f)
print(result)
print(result['feature'][2])
f.close() #記得最后關(guān)閉
結(jié)果:

