在不一樣編程語言之間傳遞對象,須把對象序列化爲標準格式,好比XML
但更好的方法是序列化爲JSON,由於JSON表示出來就是一個字符串,可被全部語言讀取,也可方便地存儲到磁盤或者經過網絡傳輸
JSON不只是標準格式,而且比XML更快,並且可直接在Web頁面中讀取,由於JSON表示的對象就是標準的JavaScript語言的對象編程
JSON和Python內置的數據類型對應以下:json
JSON類型 | Python類型 |
{} | dict |
[] | list |
"string" | str |
1234.56 | int或float |
true/false | True/False |
null | None |
使用示例網絡
序列化與反序列化之json(字符串)編程語言
import json d = dict(name='Bob', age=20, score=88) #dict對象能夠直接序列化爲JSON的{} print(json.dumps(d)) #輸出:{"name": "Bob", "age": 20, "score": 88} #把對象序列化爲標準的json字符串格式 json_str = '{"age": 20, "score": 88, "name": "Bob"}' print(json.loads(json_str)) #輸出:{"name": "Bob", "age": 20, "score": 88} #把JSON字符串反序列化出對象
序列化與反序列化之json(文件)函數
import json d = dict(name='Bob', age=20, score=88) f = open('dump.txt', 'w') json.dump(d, f) #把對象序列化成json字符串後寫入一個file-like Object f.close() f1 = open('dump.txt', 'r') d1 = json.load(f1) #從一個file-like Object中將json字符串反序列化出對象 f1.close() print(d1) #輸出:{'name': 'Bob', 'age': 20, 'score': 88}
序列化與反序列化之json(自定義對象)編碼
import json class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score def student2dict(std): return { 'name': std.name, 'age': std.age, 'score': std.score } def dict2student(d): return Student(d['name'], d['age'], d['score']) s = Student('Bob', 20, 88) #Student對象是沒法直接經過dumps方法轉換json的,須要轉換成dict print(json.dumps(s, default=student2dict)) #該方式能夠將任意class轉換爲dict #一般class的實例都有一個__dict__屬性,它就是一個dict,用來存儲實例變量。也有少數例外,好比定義了__slots__的class print(json.dumps(s, default=lambda obj: obj.__dict__)) #loads()方法首先轉換出一個dict對象,而後,傳入的object_hook函數負責把dict轉換爲Student json_str = '{"age": 20, "score": 88, "name": "Bob"}' print(json.loads(json_str, object_hook=dict2student))
注意:因爲JSON標準規定JSON編碼是UTF-8,因此咱們老是能正確地在Python的str與JSON的字符串之間轉換spa