Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Python-bezogenen Operationsbeispielen auf JSON

Detaillierte Erläuterung von Python-bezogenen Operationsbeispielen auf JSON

高洛峰
高洛峰Original
2017-01-07 13:17:401163Durchsuche

In diesem Artikel werden die zugehörigen Vorgänge von Python auf JSON anhand von Beispielen analysiert. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Was ist JSON:

JSON (JavaScript Object Notation) ist ein leichtes Datenaustauschformat. Für Menschen leicht zu lesen und zu schreiben. Es ist auch für Maschinen einfach zu analysieren und zu generieren. Es basiert auf der Programmiersprache JavaScript, einer Teilmenge des Standards ECMA-262, 3. Ausgabe – Dezember 1999. JSON verwendet ein völlig sprachunabhängiges Textformat, verwendet aber auch Konventionen ähnlich der C-Sprachfamilie (einschließlich C, C++, C#, Java, JavaScript, Perl, Python usw.). Diese Eigenschaften machen JSON zu einer idealen Datenaustauschsprache.

JSON besteht aus zwei Strukturen:

Eine Sammlung von Name/Wert-Paaren. In verschiedenen Sprachen wird es als Objekt, Datensatz, Struktur, Wörterbuch, Hash-Tabelle, verschlüsselte Liste oder assoziatives Array verstanden.

Eine geordnete Liste von Werten. In den meisten Sprachen wird es als Array verstanden.

Dies sind gängige Datenstrukturen. Tatsächlich unterstützen die meisten modernen Computersprachen sie in irgendeiner Form. Dadurch ist es möglich, ein Datenformat zwischen Programmiersprachen auszutauschen, die ebenfalls auf diesen Strukturen basieren.

Die offizielle Beschreibung von JSON finden Sie unter: http://json.org/

Die Standard-API-Bibliotheksreferenz für Python zum Betrieb von JSON: http://docs.python.org/ library/json.html

Kodierung und Dekodierung einfacher Datentypen:

Verwenden Sie die einfache json.dumps-Methode, um einfache Datentypen zu kodieren, zum Beispiel:

import json
obj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]
encodedjson = json.dumps(obj)
print repr(obj)
print encodedjson

Ausgabe:

[[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}]
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}]

Wie aus den Ausgabeergebnissen ersichtlich ist, ist der einfache Typ nach der Codierung seiner ursprünglichen repr()-Ausgabe sehr ähnlich, einige Datentypen wurden jedoch geändert. Zum Beispiel das Tupel in Das obige Beispiel wird in eine Liste umgewandelt. Während des Codierungsprozesses von JSON findet ein Konvertierungsprozess vom Python-Originaltyp in den JSON-Typ statt. Der spezifische Konvertierungsvergleich lautet wie folgt:

Detaillierte Erläuterung von Python-bezogenen Operationsbeispielen auf JSON

The json.dumps(). Die Methode gibt ein str-Objekt encodedjson zurück. Als nächstes dekodieren wir encodedjson, um die zu verwendende Funktion json.loads() zu erhalten:

decodejson = json.loads(encodedjson)
print type(decodejson)
print decodejson[4]['key1']
print decodejson

Ausgabe:

<type &#39;list&#39;>
[1, 2, 3]
[[1, 2, 3], 123, 123.123, u&#39;abc&#39;, {u&#39;key2&#39;: [4, 5, 6], u&#39;key1&#39;: [1, 2, 3]}]

Die Loads-Methode gibt das ursprüngliche Objekt zurück, es finden jedoch weiterhin einige Datentypkonvertierungen statt. Im obigen Beispiel wird beispielsweise „abc“ in den Unicode-Typ konvertiert. Der Vergleich der Typkonvertierung von JSON nach Python ist wie folgt:

Detaillierte Erläuterung von Python-bezogenen Operationsbeispielen auf JSON

Die Methode json.dumps bietet viele nützliche Parameter zur Auswahl. Die am häufigsten verwendeten sind sort_keys (für Diktobjekte) Sortierung, wir wissen, dass das Standarddikt ungeordnet gespeichert wird), Trennzeichen, Einzug und andere Parameter.

Die Sortierfunktion erleichtert die Beobachtung der gespeicherten Daten und ermöglicht auch den Vergleich von JSON-Ausgabeobjekten, zum Beispiel:

data1 = {&#39;b&#39;:789,&#39;c&#39;:456,&#39;a&#39;:123}
data2 = {&#39;a&#39;:123,&#39;b&#39;:789,&#39;c&#39;:456}
d1 = json.dumps(data1,sort_keys=True)
d2 = json.dumps(data2)
d3 = json.dumps(data2,sort_keys=True)
print d1
print d2
print d3
print d1==d2
print d1==d3

Ausgabe:

{"a": 123, "b": 789, "c": 456}
{"a": 123, "c": 456, "b": 789}
{"a": 123, "b": 789, "c": 456}
False
True

Im obigen Beispiel sollten ursprünglich Daten1 und Daten2 identisch sein, aber aufgrund der ungeordneten Natur der Diktatspeicherung sind die zwei können nicht vergleichen. Daher können die beiden sortierten Ergebnisse gespeichert werden, um Dateninkonsistenzen zu vermeiden. Vor dem Speichern nach dem Sortieren muss das System jedoch weitere Dinge tun, was definitiv zu einem gewissen Leistungsverbrauch führt. Daher ist eine angemessene Sortierung sehr wichtig.

Der Parameter indent bedeutet Einrückung, wodurch das Format der Datenspeicherung eleganter gestaltet werden kann.

data1 = {&#39;b&#39;:789,&#39;c&#39;:456,&#39;a&#39;:123}
d1 = json.dumps(data1,sort_keys=True,indent=4)
print d1

Ausgabe:

{
 "a": 123,
 "b": 789,
 "c": 456
}

Die Ausgabedaten werden danach formatiert Dadurch wird es besser lesbar, aber es wird durch das Hinzufügen einiger überflüssiger Leerzeichen aufgefüllt. JSON existiert hauptsächlich als Datenkommunikationsformat, und bei der Netzwerkkommunikation ist die Größe der Daten sehr wichtig. Unnützer Speicherplatz belegt viel Kommunikationsbandbreite, daher müssen die Daten gegebenenfalls komprimiert werden. Der Trennparameter kann diese Rolle spielen. Der übergebene Parameter ist ein Tupel, der die Zeichenfolge des geteilten Objekts enthält.

print &#39;DATA:&#39;, repr(data)
print &#39;repr(data)  :&#39;, len(repr(data))
print &#39;dumps(data)  :&#39;, len(json.dumps(data))
print &#39;dumps(data, indent=2) :&#39;, len(json.dumps(data, indent=4))
print &#39;dumps(data, separators):&#39;, len(json.dumps(data, separators=(&#39;,&#39;,&#39;:&#39;)))

Ausgabe:

DATA: {&#39;a&#39;: 123, &#39;c&#39;: 456, &#39;b&#39;: 789}
repr(data)  : 30
dumps(data)  : 30
dumps(data, indent=2) : 46
dumps(data, separators): 25

durch Entfernen zusätzlicher Leerzeichensymbole, Der Zweck der Datenkomprimierung wird erreicht, und der Effekt ist ziemlich offensichtlich.

Ein weiterer nützlicher Dump-Parameter ist „skipkeys“, der standardmäßig auf „False“ eingestellt ist. Wenn die dumps-Methode ein dict-Objekt speichert, muss der Schlüssel vom Typ str sein. Wenn andere Typen angezeigt werden, wird eine TypeError-Ausnahme generiert. Wenn dieser Parameter aktiviert und auf True gesetzt ist, ist er eleganter.

data = {&#39;b&#39;:789,&#39;c&#39;:456,(1,2):123}
print json.dumps(data,skipkeys=True)

Ausgabe:

{"c": 456, "b": 789}

Verarbeiten Sie Ihre eigenen Datentypen

Das JSON-Modul kann nicht nur normale in Python integrierte Typen verarbeiten, sondern auch unsere benutzerdefinierten Datentypen, und es ist häufig üblich, benutzerdefinierte Objekte zu verarbeiten.

Zuerst definieren wir eine Klasse Person.

class Person(object):
 def __init__(self,name,age):
 self.name = name
 self.age = age
 def __repr__(self):
 return &#39;Person Object name : %s , age : %d&#39; % (self.name,self.age)
if __name__ == &#39;__main__&#39;:
 p = Person(&#39;Peter&#39;,22)
 print p

如果直接通过json.dumps方法对Person的实例进行处理的话,会报错,因为json无法支持这样的自动转化。通过上面所提到的json和python的类型转化对照表,可以发现,object类型是和dict相关联的,所以我们需要把我们自定义的类型转化为dict,然后再进行处理。这里,有两种方法可以使用。

方法一:自己写转化函数

&#39;&#39;&#39;
Created on 2011-12-14
@author: Peter
&#39;&#39;&#39;
import Person
import json
p = Person.Person(&#39;Peter&#39;,22)
def object2dict(obj):
 #convert object to a dict
 d = {}
 d[&#39;__class__&#39;] = obj.__class__.__name__
 d[&#39;__module__&#39;] = obj.__module__
 d.update(obj.__dict__)
 return d
def dict2object(d):
 #convert dict to object
 if&#39;__class__&#39; in d:
 class_name = d.pop(&#39;__class__&#39;)
 module_name = d.pop(&#39;__module__&#39;)
 module = __import__(module_name)
 class_ = getattr(module,class_name)
 args = dict((key.encode(&#39;ascii&#39;), value) for key, value in d.items()) #get args
 inst = class_(**args) #create new instance
 else:
 inst = d
 return inst
d = object2dict(p)
print d
#{&#39;age&#39;: 22, &#39;__module__&#39;: &#39;Person&#39;, &#39;__class__&#39;: &#39;Person&#39;, &#39;name&#39;: &#39;Peter&#39;}
o = dict2object(d)
print type(o),o
#<class &#39;Person.Person&#39;> Person Object name : Peter , age : 22
dump = json.dumps(p,default=object2dict)
print dump
#{"age": 22, "__module__": "Person", "__class__": "Person", "name": "Peter"}
load = json.loads(dump,object_hook = dict2object)
print load
#Person Object name : Peter , age : 22

   

上面代码已经写的很清楚了,实质就是自定义object类型和dict类型进行转化。object2dict函数将对象模块名、类名以及__dict__存储在dict对象里,并返回。dict2object函数则是反解出模块名、类名、参数,创建新的对象并返回。在json.dumps 方法中增加default参数,该参数表示在转化过程中调用指定的函数,同样在decode过程中json.loads方法增加object_hook,指定转化函数。

方法二:继承JSONEncoder和JSONDecoder类,覆写相关方法

JSONEncoder类负责编码,主要是通过其default函数进行转化,我们可以override该方法。同理对于JSONDecoder。

&#39;&#39;&#39;
Created on 2011-12-14
@author: Peter
&#39;&#39;&#39;
import Person
import json
p = Person.Person(&#39;Peter&#39;,22)
class MyEncoder(json.JSONEncoder):
 def default(self,obj):
 #convert object to a dict
 d = {}
 d[&#39;__class__&#39;] = obj.__class__.__name__
 d[&#39;__module__&#39;] = obj.__module__
 d.update(obj.__dict__)
 return d
class MyDecoder(json.JSONDecoder):
 def __init__(self):
 json.JSONDecoder.__init__(self,object_hook=self.dict2object)
 def dict2object(self,d):
 #convert dict to object
 if&#39;__class__&#39; in d:
  class_name = d.pop(&#39;__class__&#39;)
  module_name = d.pop(&#39;__module__&#39;)
  module = __import__(module_name)
  class_ = getattr(module,class_name)
  args = dict((key.encode(&#39;ascii&#39;), value) for key, value in d.items()) #get args
  inst = class_(**args) #create new instance
 else:
  inst = d
 return inst
d = MyEncoder().encode(p)
o = MyDecoder().decode(d)
print d
print type(o), o

   

对于JSONDecoder类方法,稍微有点不同,但是改写起来也不是很麻烦。看代码应该就比较清楚了。

希望本文所述对大家Python程序设计有所帮助。

更多Detaillierte Erläuterung von Python-bezogenen Operationsbeispielen auf JSON相关文章请关注PHP中文网!

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