1. 程式人生 > >Python學習之json序列化

Python學習之json序列化

一、什麼是序列化

在我們儲存資料或者網路傳輸資料的時候,需要對我們的物件進行處理,把物件處理成方便儲存和傳輸的資料格式。這個過程叫序列化,不同的序列化結果也不同,但目的是一樣的,都是為了儲存和傳輸
在Python中三種序列化的方案:

  1. pickle,可以將我們Python中任意資料型別轉化為bytes並寫入到檔案中。同樣也可以把檔案中寫好的bytes轉換回到我們Python的資料-這個過程被稱為反序列化。
  2. shelve簡單另類的一種序列化方案。有點類似於Redis,可以作為一種小型的資料庫來使用。
  3. json,將Python中常見的字典,列表轉化成字串,是目前前後端資料互動使用頻率最高的一種資料模式。

二、json

1.什麼是json

json是前後端互動的樞紐,相當於程式設計界的普通話,前後端用Python溝通。因為json的語法格式可以完美的表示出一個物件。那麼什麼是json:json全稱JavaScript object notation,即js物件簡譜,例如下面程式碼示例:

{
  "id": 1,
  "title": "Python從入門到放棄(第二版)",
  "pub_date": "2018-01-11",
  "category": "Python",
  "publisher": {
    "id": 1,
    "name": "北京出版社"
  },
  "post_authors": [
    {
      "id": 2,
      "name": "佚名"
    }
  ]
}

這段形如Python字典的東西在JavaScript裡面叫json,其實是一樣的。我們發現用這樣的資料結構可以完美的表示出任何物件,並且可以完整的把物件表示出來。只要程式碼格式比較好,那麼可讀性也挺強的,所以大家公認用這樣一種資料結構作為資料互動的格式。
在json之前,通常用的資料結構為XML,形如:

<?xml version="1.0" encoding="utf-8" ?>
<book>
<title>Python從入門到放棄(第二版)</title> 
<pub_date>2018-01-11</pub_date> 
<category>Python</category> 
<publisher>
    <id>1</id> 
    <name>北京出版社</name> 
</publisher>
</book>

總之,XML格式的檔案在維護和處理上相比json檔案很難解析,所以後來大都傾向於使用json這一資料結構了。

2.json在Python中的用法

字典 -> json

要先引入json模組,再進行處理

import json
dic = {"姓名": "程式猿", "年齡": 28, "頭髮": None}
s = json.dumps(dic)
print(s)

# 輸出:
>>>{"\u59d3\u540d": "\u7a0b\u5e8f\u733f", "\u5e74\u9f84": 28, "\u5934\u53d1": null}

結果很不友好啊. 那如何處理成中⽂呢? 在dumps的時候給出另一個引數ensure_ascii=False就可以了了。

import json
dic = {"姓名": "程式猿", "年齡": 28, "頭髮": None}
s = json.dumps(dic, ensure_ascii=False)
print(s)

# 輸出:
>>>{"姓名": "程式猿", "年齡": 28, "頭髮": null}

json -> 字典

上面介紹的是如何把字典格式的資料轉化為json,那麼怎麼把前端傳遞過來的json檔案轉化為字典格式呢:

import json
s = '{"姓名": "程式猿", "年齡": 28, "頭髮": null}'  
# 注意此處要加引號,表示s為字串-the JSON object must be str
dic = json.loads(s)
print(dic)
print(type(dic))

# 輸出:
>>> {'姓名': '程式猿', '年齡': 28, '頭髮': None} 
>>> <class 'dict'>

寫入/讀取json檔案

json也可以像pickle一樣把序列化的結果寫入到檔案中: