Heim > Artikel > Backend-Entwicklung > Detaillierte Erklärung von JSON und Pickle für die Python-Serialisierung
JSON-Modul
JSON (JavaScript Object Notation) ist ein leichtes Datenaustauschformat. Es basiert auf einer Teilmenge von ECMAScript. JSON verwendet ein völlig sprachunabhängiges Textformat, verwendet aber auch Konventionen ähnlich der C-Sprachfamilie (einschließlich C, C++, Java, JavaScript, Perl, Python usw.). Diese Eigenschaften machen JSON zu einer idealen Datenaustauschsprache. Es ist für Menschen leicht zu lesen und zu schreiben, und es ist auch für Maschinen leicht zu analysieren und zu generieren (wird im Allgemeinen zur Erhöhung der Netzwerkübertragungsraten verwendet).
JSON besteht in Python aus einer Liste bzw. einem Diktat.
1. Python-Typdaten und JSON-Datenformat ineinander konvertieren
pthon Der str-Typ in JSON wird in den Unicode-Typ konvertiert, None wird in konvertiert null und dict entsprechen Objekt
2. Datenkodierung und -dekodierung
1. Einfache Datenkodierung und -dekodierung
Der sogenannte einfache Typ bezieht sich auf den Python-Typ erscheint in der obigen Tabelle.
dumps: Serialisieren Sie das Objekt
#coding:utf-8 import json # 简单编码=========================================== print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) # ["foo", {"bar": ["baz", null, 1.0, 2]}] #字典排序 print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True) # {"a": 0, "b": 0, "c": 0} #自定义分隔符 print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':')) # [1,2,3,{"4":5,"6":7}] print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=('/','-')) # [1/2/3/{"4"-5/"6"-7}] #增加缩进,增强可读性,但缩进空格会使数据变大 print json.dumps({'4': 5, '6': 7}, sort_keys=True,indent=2, separators=(',', ': ')) # { # "4": 5, # "6": 7 # } # 另一个比较有用的dumps参数是skipkeys,默认为False。 # dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,会忽略这个key。 data = {'a':1,(1,2):123} print json.dumps(data,skipkeys=True) #{"a": 1}
dump: Serialisieren Sie das Objekt und speichern Sie es in der Datei
# Serialisieren Sie das Objekt und speichern Sie es in der Datei obj = [ ' foo', {'bar': ('baz', None, 1.0, 2)}]
mit open(r"c:json.txt","w ") as f:
json.dump ( obj,f)
Ladet: Deserialisiere die serialisierte Zeichenfolge
import json obj = ['foo', {'bar': ('baz', None, 1.0, 2)}] a= json.dumps(obj) print json.loads(a) # [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
Laden: Lies die serialisierte Zeichenfolge aus der Datei und deserialisiere sie
mit open( r"c:json.txt", "r") as f: print json.load(f)
3. Benutzerdefinierte komplexe Datentyp-Kodierung und -Dekodierung
Zum Beispiel: Wenn wir auf Datentypen wie Datetime-Objekte oder benutzerdefinierte Klassenobjekte stoßen, die von JSON standardmäßig nicht unterstützt werden, müssen wir die Codierungs- und Decodierungsfunktionen anpassen. Es gibt zwei Möglichkeiten, benutzerdefinierte Codecs zu implementieren.
1. Methode 1: Passen Sie die Kodierungs- und Dekodierungsfunktion an
#! /usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "TKQ" import datetime,json dt = datetime.datetime.now() def time2str(obj): #python to json if isinstance(obj, datetime.datetime): json_str = {"datetime":obj.strftime("%Y-%m-%d %X")} return json_str return obj def str2time(json_obj): #json to python if "datetime" in json_obj: date_str,time_str = json_obj["datetime"].split(' ') date = [int(x) for x in date_str.split('-')] time = [int(x) for x in time_str.split(':')] dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2]) return dt return json_obj a = json.dumps(dt,default=time2str) print a # {"datetime": "2016-10-27 17:38:31"} print json.loads(a,object_hook=str2time) # 2016-10-27 17:38:31
2. Methode 2: Erben Sie die Klassen JSONEncoder und JSONDecoder und schreiben Sie die relevanten Methoden neu
#! /usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "TKQ" import datetime,json dt = datetime.datetime.now() dd = [dt,[1,2,3]] class MyEncoder(json.JSONEncoder): def default(self,obj): #python to json if isinstance(obj, datetime.datetime): json_str = {"datetime":obj.strftime("%Y-%m-%d %X")} return json_str return obj class MyDecoder(json.JSONDecoder): def __init__(self): json.JSONDecoder.__init__(self, object_hook=self.str2time) def str2time(self,json_obj): #json to python if "datetime" in json_obj: date_str,time_str = json_obj["datetime"].split(' ') date = [int(x) for x in date_str.split('-')] time = [int(x) for x in time_str.split(':')] dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2]) return dt return json_obj # a = json.dumps(dt,default=time2str) a =MyEncoder().encode(dd) print a # [{"datetime": "2016-10-27 18:14:54"}, [1, 2, 3]] print MyDecoder().decode(a) # [datetime.datetime(2016, 10, 27, 18, 14, 54), [1, 2, 3]]
Pickle-Modul
Pythons Pickle-Modul implementiert die gesamte Datenserialisierung und Deserialisierung von Python. Grundsätzlich unterscheidet sich die Funktionsnutzung nicht wesentlich vom JSON-Modul, und die Methoden sind ebenfalls dumps/dump und Loads/load. cPickle ist eine relativ schnellere, in C-Sprache kompilierte Version des Pickle-Moduls.
Im Gegensatz zu JSON wird Pickle nicht für die Datenübertragung zwischen mehreren Sprachen verwendet. Es wird nur als Persistenzmethode für Python-Objekte oder als Methode zum Übertragen von Objekten zwischen Python-Programmen verwendet und unterstützt daher alle Python-Daten .
Das durch Pickle deserialisierte Objekt ist ein äquivalentes Kopierobjekt zum Originalobjekt, ähnlich wie Deepcopy.
Dumps/Dump-Serialisierung
from datetime import date try: import cPickle as pickle #python 2 except ImportError as e: import pickle #python 3 src_dic = {"date":date.today(),"oth":([1,"a"],None,True,False),} det_str = pickle.dumps(src_dic) print det_str # (dp1 # S'date' # p2 # cdatetime # date # p3 # (S'\x07\xe0\n\x1b' # tRp4 # sS'oth' # p5 # ((lp6 # I1 # aS'a' # aNI01 # I00 # tp7 # s. with open(r"c:\pickle.txt","w") as f: pickle.dump(src_dic,f)
Ladevorgänge/Deserialisierung
from datetime import date try: import cPickle as pickle #python 2 except ImportError as e: import pickle #python 3 src_dic = {"date":date.today(),"oth":([1,"a"],None,True,False),} det_str = pickle.dumps(src_dic) with open(r"c:\pickle.txt","r") as f: print pickle.load(f) # {'date': datetime.date(2016, 10, 27), 'oth': ([1, 'a'], None, True, False)}
Der Unterschied zwischen JSON- und Pickle-Modulen
1. JSON Nur Basic Datentypen verarbeitet werden können. pickle kann alle Python-Datentypen verarbeiten.
2. JSON wird für die Zeichenkonvertierung zwischen verschiedenen Sprachen verwendet. Pickle wird für die Persistenz von Python-Programmobjekten oder die Netzwerkübertragung von Objekten zwischen Python-Programmen verwendet, es kann jedoch Unterschiede bei der Serialisierung verschiedener Python-Versionen geben.