1. 程式人生 > >python及Django的json序列化

python及Django的json序列化

int 示例 port 額外 filter model pytho 繼承 函數實現

JSON是一種文本序列化格式(它輸出的是unicode文件,大多數時候會被編碼為utf-8),人們很容易進行閱讀和編寫。python自帶的dumps方法很有用,能很容易將字典dict類型數據轉化為json格式,然後還有很多類型的數據(如日期,集合, 自定義的類和Django的QuerySet類型),我們需要自定義序列化方法才能將它們轉化為json格式。

python自帶的json庫(無需額外安裝), 主要包含了dumps, loads, dump和load四種方法其作用分別如下所示。

  • json.loads() - 將json字符串轉換為python數據類型

  • json.dumps() - 將python數據類型轉化為json字符串

  • json.dump() - 將python輸入轉化為json格式存入磁盤文件

  • json.load() - 將磁盤文件中json格式數據轉換為python數據類型

與dumps方法不同,json模塊的dump方法用於將生成的json數據寫入磁盤文件。其用法和dumps類似,唯一不同的是需要指定需要寫入的文件

json的loads方法用於將json格式數據轉化為python格式

json的load方法與loads用法相似,不過它需要指定存有json數據的文件。

很多python格式數據不能直接被dumps方法序列化,很多python數據類型(比如日期,集合和自定義的類)並不能直接被dumps方法序列化

我們有兩種解決方案。

  • 通過數據類型轉換函數實現,我們不能直接序列化就先轉化為json能接受的數據類型再序列化,obj —> str —> json.dumps —> json.loads —> str —> obj
  • 通過繼承JSONEncoder和JSONDecoder類實現,在類中添加針對目標數據類型的序列化接解決方案

對於簡單的數據序列化,方案一更容易理解,代碼也更少。但當需要傳輸的數據很大時,使用繼承JSONEncoder類來實現序列化時有個很大的好處,就是可以通過iterencode()方法把一個很大的數據對象分多次進行序列化,這對於網絡持續傳輸或寫入大的文件非常有用。

>>> for chunk in MyJSONEncoder().iterencode(big_object):
...     print(chunk)

Django有自己專屬的數據類型比如QuerySet和ValueQuerySet類型數據,還提供了更便捷的serializers類。使用serializers類可以輕易將QuerySet格式的數據轉化為json格式。

# Django Queryset數據 to Json
from django.core import serializers
data = serializers.serialize("json", SomeModel.objects.all())
data1 = serializers.serialize("json", SomeModel.objects.all(), fields=(‘name‘,‘id‘))
data2 = serializers.serialize("json", SomeModel.objects.filter(field = some_value))

ValuesQuerySet對象不能用 serializers.serialize() 方法序列化成json, 需要先轉換成list再用 json.dumps()方法序列化成json格式。示例代碼如下所示:

import json
from django.core.serializers.json import DjangoJSONEncoder

queryset = myModel.objects.filter(foo_icontains=bar).values(‘f1‘, ‘f2‘, ‘f3‘)
data4 = json.dumps(list(queryset), cls=DjangoJSONEncoder)

python及Django的json序列化