序列化與反序列化之json

在不一樣編程語言之間傳遞對象,須把對象序列化爲標準格式,好比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

相關文章
相關標籤/搜索