Json、hashlib、base64

json模塊

JSON全稱是(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)格式,一般用于前后臺,數(shù)據(jù)的交互。

JSON:輕量級的數(shù)據(jù)交互格式,它實際在傳輸?shù)臅r候都是字符串
JSON:一種交互的格式,所有的語言基本上都有字符串,可以傳遞
js對象:是一種js數(shù)據(jù)類型,是js特有的,無法傳遞交互數(shù)據(jù)

JSON語法規(guī)則:

  1. 數(shù)據(jù)由鍵值對組成;
  2. 鍵值對由逗號分隔;
  3. 大括號里保存對象;
  4. 中括號里保存數(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ù)安全

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

HASH

image.png

特點

  • 不可逆:無法根據(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編碼)

image.png

特點

用來將非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é)果:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容