Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung von JSON und Pickle für die Python-Serialisierung

Detaillierte Erklärung von JSON und Pickle für die Python-Serialisierung

高洛峰
高洛峰Original
2016-10-29 10:17:041450Durchsuche

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

Detaillierte Erklärung von JSON und Pickle für die Python-Serialisierung

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.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn