Python实现支持JSON存储和解析的对象
我们知道利用JSON模块可方便的将Python基本类型(dict、list等)数据永久的存储成文件,同时也可以通过自定义转换函数和继承JSON encode&decode的方法实现自定义类的存储。本文就在前文“ Python JSON模块”的基础上,实现python支持JSON存储的对象。
对象能够采取JSON存储和解析是有很大意义的。例如机器学习中所有分类算法的训练过程中都存在大量的数据计算,如果每次启动分类都需要重新训练分类算法浪费资源且没有效率,如果能够将训练产生的分类算法对象保存起来,那么除非需要算法调优,以后只需载入即可。另一方面,对象能够进行JSON解析和存储也使得其可以在网络上传送,这在当下云计算、分布式数据处理中都有非凡的意义。
为了实现自存储和解析,定义对象的关键操作有:
0,将object_json.py copy至包中,定义对象的模块导入object_json:import object_json。
1,init()函数要支持可变数量的函数调用,即要写成init(self, …, , **args)。如此定义对象才可以有除构造阶段需要初始化的属性之外的属性。
2,对于对象构造阶段必须初始化的属性,init()函数中的形参必须与这些属性名称完全相同,如此才能通过字典‘key’: value对构造对象。
3,定义一个属性‘name’–该对象实例的名称,利用inspect模块实现。‘name‘属性主要用于产生对象存储时默认的文件名称。
4,定义jsonDumps()和jsonLoadTransfer()方法,通过objectLoadFromFile()完成对象JSON文件load和新对象创建。
(i)jsonDumps()用于将对象转换成dict并通过json.dumps()将对象存储成json文件,若用户不指定文件名则以instancename.json为默认存储文件。由于JSON只支持python基本类型,因此若对象中有一些其他类型(如numpy matrix),则需将其转化成Python基本类型(如matrix.tolist()将matrix转换成list)。
(ii)jsonLoadTransfer()用于完成数据格式的转换,将一些对象属性从基本类型转化成需要的类型(如mat(list)将类型从list转换成matrix),若对象只有Python基本类型则可以省略该方法。创建完整、可用对象过程是:
obj = objectLoadFromFile() obj.jsonLoadTransfer()
下面的代码就是支持自定义对象进行JSON存储和解析的object_json模块源码。
import json import inspect import pdb def object2dict(obj): #convert object to a dict d = {'class':obj.class.name, 'module':obj.module} d.update(obj.dict) return d def objectDumps2File(obj, jsonfile): objDict = object2dict(obj) with open(jsonfile, 'w') as f: f.write(json.dumps(objDict)) def dict2object(d): '''convert dict to object, the dict will be changed''' if'class' in d: class_name = d.pop('class') module_name = d.pop('module') module = import(module_name) #print 'the module is:', module class_ = getattr(module,class_name) args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args #print 'the atrribute:', repr(args) #pdb.set_trace() inst = class_(**args) #create new instance else: inst = d return inst def objectLoadFromFile(jsonFile): '''load json file and generate a new object instance whose name filed will be 'inst' ''' with open(jsonFile) as f: objectDict =json.load(f) obj = dict2object(objectDict) return obj #test function if name == 'main': class Person(object): def init(self,name,age, **args): obj_list = inspect.stack()[1][-2] self.name = obj_list[0].split('=')[0].strip()#object instance name self.name = name self.age = age def repr(self): return 'Person Object name : %s , age : %d' % (self.name,self.age) def say(self): #d = inspect.stack()[1][-2] #print d[0].split('.')[0].strip() return self.name def jsonDumps(self, filename=None): '''essential transformation to Python basic type in order to store as json. dumps as objectname.json if filename missed ''' if not filename: jsonfile = self.name+'.json' else: jsonfile = filename objectDumps2File(self, jsonfile) def jsonLoadTransfer(self):#TBD '''essential transformation to object required type,such as numpy matrix.call this function after newobject = objectLoadFromFile(jsonfile)''' pass p = Person('Aidan',22) #json.dumps(p)#error will be throwed #objectDumps2File(p,'Person.json') p.jsonDumps() p_l = objectLoadFromFile('p.json') print 'the decoded obj type: %s, obj:%s' % (type(p_l),repr(p_l))
Python类有新旧两种,py 2.2 后类定义继承 object 的目的是使这个类成为 new style class, 没有继承 object 的为传统classic class(最终也会继承object)。
类定义中如下两种方法:
class Person(): class Person(object)
其区别在于:
若创建新的Person instanc test,则type(test)的输出分别为:
<type 'instance'> <class 'main.Person'>
inspect 模块提供了一系列自省函数,它可以获取模块,类,方法,函数,traceback,帧对象,代码对象的信息。常用的方法getmembers,ismodule,getcallargs,isclass等,
Atas ialah kandungan terperinci Python实现支持JSON存储和解析的对象. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Anotasi Gson@Expose boleh digunakan untuk menandakan sama ada medan terdedah (terkandung atau tidak) untuk bersiri atau penyahsirilan. Anotasi @Expose boleh mengambil dua parameter, setiap parameter ialah nilai boolean dan boleh mengambil nilai benar atau salah. Untuk GSON bertindak balas terhadap anotasi @Expose, kita perlu mencipta tika Gson menggunakan kelas GsonBuilder dan perlu memanggil kaedah excludeFieldsWithoutExposeAnnotation(), yang mengkonfigurasi Gson untuk mengecualikan semua medan tanpa anotasi Expose daripada bersiri atau penyahserialisasian. Sintaks publicGsonBuildereexclud

Gabungan golangWebSocket dan JSON: merealisasikan penghantaran dan penghuraian data Dalam pembangunan Web moden, penghantaran data masa nyata menjadi semakin penting. WebSocket ialah protokol yang digunakan untuk mencapai komunikasi dua hala Tidak seperti model respons permintaan HTTP tradisional, WebSocket membenarkan pelayan untuk menolak data secara aktif kepada klien. JSON (JavaScriptObjectNotation) ialah format ringan untuk pertukaran data yang ringkas dan mudah dibaca.

MySQL5.7 dan MySQL8.0 ialah dua versi pangkalan data MySQL yang berbeza Terdapat beberapa perbezaan utama antara mereka: Peningkatan prestasi: MySQL8.0 mempunyai beberapa peningkatan prestasi berbanding MySQL5.7. Ini termasuk pengoptimum pertanyaan yang lebih baik, penjanaan pelan pelaksanaan pertanyaan yang lebih cekap, algoritma pengindeksan yang lebih baik dan pertanyaan selari, dsb. Penambahbaikan ini boleh meningkatkan prestasi pertanyaan dan prestasi keseluruhan sistem. Sokongan JSON: MySQL 8.0 memperkenalkan sokongan asli untuk jenis data JSON, termasuk penyimpanan, pertanyaan dan pengindeksan data JSON. Ini menjadikan pemprosesan dan memanipulasi data JSON dalam MySQL lebih mudah dan cekap. Ciri transaksi: MySQL8.0 memperkenalkan beberapa ciri transaksi baharu, seperti atomic

Kaedah pengoptimuman prestasi untuk menukar tatasusunan PHP kepada JSON termasuk: menggunakan sambungan JSON dan fungsi json_encode() menambah pilihan JSON_UNESCAPED_UNICODE untuk mengelakkan aksara melarikan diri menggunakan penimbal untuk meningkatkan prestasi pengekodan JSON; Pustaka pengekodan JSON.

Permulaan Pantas: Kaedah Pandas membaca fail JSON, contoh kod khusus diperlukan Pengenalan: Dalam bidang analisis data dan sains data, Pandas ialah salah satu perpustakaan Python yang penting. Ia menyediakan fungsi yang kaya dan struktur data yang fleksibel, serta boleh memproses dan menganalisis pelbagai data dengan mudah. Dalam aplikasi praktikal, kita sering menghadapi situasi di mana kita perlu membaca fail JSON. Artikel ini akan memperkenalkan cara menggunakan Panda untuk membaca fail JSON dan melampirkan contoh kod tertentu. 1. Pemasangan Panda

Gunakan fungsi json.MarshalIndent dalam golang untuk menukar struktur menjadi rentetan JSON yang diformatkan Apabila menulis program dalam Golang, kita selalunya perlu menukar struktur menjadi rentetan JSON Dalam proses ini, fungsi json.MarshalIndent boleh membantu kita output berformat. Di bawah ini kami akan menerangkan secara terperinci cara menggunakan fungsi ini dan memberikan contoh kod khusus. Mula-mula, mari buat struktur yang mengandungi beberapa data. Berikut adalah petunjuk

Cara mengendalikan format data XML dan JSON dalam pembangunan C# memerlukan contoh kod khusus Dalam pembangunan perisian moden, XML dan JSON ialah dua format data yang digunakan secara meluas. XML (Extensible Markup Language) ialah bahasa penanda yang digunakan untuk menyimpan dan menghantar data, manakala JSON (JavaScript Object Notation) ialah format pertukaran data yang ringan. Dalam pembangunan C#, kami selalunya perlu memproses dan mengendalikan data XML dan JSON Artikel ini akan memfokuskan pada cara menggunakan C# untuk memproses kedua-dua format data ini dan melampirkan

Anotasi dalam perpustakaan Jackson mengawal pensirilan dan penyahserilangan JSON: Pensirilan: @JsonIgnore: Abaikan harta @JsonProperty: Tentukan nama @JsonGetter: Gunakan kaedah get @JsonSetter: Gunakan kaedah yang ditetapkan Deserialization: @JsonIgnoreProperties: Abaikan harta @ JsonProperty: Nyatakan nama @JsonCreator: Gunakan pembina @JsonDeserialize: Logik tersuai
