Anda berada di sini karena ketika Anda mendekode data JSON dan mengharapkan data JSON menjadi jenis dict, tetapi hasilnya adalah jenis list
Bacaan lebih lanjut
- Selesaikan Latihan Python JSON untuk melatih keterampilan Python JSON
Dengan kata lain, Anda ingin mengurai file JSON dan mengonversi data JSON menjadi kamus sehingga Anda dapat mengakses JSON menggunakan pasangan nilai kuncinya, tetapi saat Anda mengurai data JSON, Anda menerima daftar, bukan kamus. Pada artikel ini, kita akan melihat cara mengakses data dalam situasi seperti itu. Sebelumnya, pahami terlebih dahulu mengapa hal ini terjadi
- Itu bisa terjadi karena JSON Anda adalah array dengan satu objek di dalamnya, misalnya, seseorang membuat serial daftar Python menjadi JSON. Jadi saat Anda menguraikannya, Anda mendapatkan objek daftar sebagai gantinya. Dalam hal ini, Anda perlu mengulang daftar untuk mengakses data
- Juga, jika seseorang membuat serial daftar Python (yang berisi kamus) ke dalam JSON. Saat Anda menguraikannya, Anda akan mendapatkan daftar dengan kamus di dalamnya. Kami akan melihat cara mengakses data tersebut
Kita akan melihat kedua contoh tersebut. tapi pertama-tama, pahami skenario dengan sebuah contoh
import json sampleList = [125, 23, 85, 445] # Serialization print("serialize into JSON and write into a file") with open("sampleFile.json", "w") as write_file: json.dump(sampleList, write_file) print("Done Writing into a file") # Deserialization print("Started Reading JSON data from file") with open("sampleFile.json", "r") as read_file: data = json.load(read_file) print("Type of deserialized data: ", type(data))Keluaran
serialize into JSON and write into a file Done Writing into a file Started Reading JSON data from file Type of deserialized data: <class 'list'>_Seperti yang Anda lihat, kami menerima daftar dari json. load() karena kami hanya membuat serial objek jenis daftar. Sekarang kita dapat mengakses data dengan mengulanginya seperti ini. cukup tambahkan baris berikut di akhir contoh di atas dan jalankan
print("Data is") for i in data: print(i)Keluaran
Data is 125 23 85 445Deserialisasi array JSON yang berisi kamus di dalamnya
Sekarang, Mari kita lihat skenario kedua. Mari kita asumsikan seseorang membuat serial daftar Python (yang berisi kamus) ke dalam JSON. saya. e. , Daftar berisi kamus di dalamnya
Dalam contoh ini, saya membuat serial MarksList berikut ke dalam JSON
Anda dapat mengakses kamus sebenarnya secara langsung dengan mengakses item ke-0 dari daftar. Mari kita lihat contohnya sekarang
Pada artikel ini, kita akan mempelajari cara mengonversi data JSON menjadi objek kustom Python. saya. e. , Parsing dan ubah JSON menjadi Kelas Python. Misalnya, Anda menerima data JSON karyawan dari API atau Anda membaca JSON dari file dan ingin mengonversinya menjadi tipe Karyawan khusus
Anda tahu cara menyandikan objek Python ke dalam JSON. Saat Anda memuat data JSON dari file atau String menggunakan json. beban() dan json. metode beban() , ia mengembalikan After Converting JSON Data into Custom Python Object 1 Emma2
Jika kami memuat data JSON langsung ke tipe kustom kami, kami dapat memanipulasi dan menggunakannya dengan lebih mudah. Ada berbagai cara untuk mencapai ini. Anda dapat memilih cara yang menurut Anda lebih berguna untuk masalah Anda. Mari kita lihat cara membatalkan serialisasi string JSON ke objek Python khusus
Bacaan lebih lanjut
- Selesaikan Latihan Python JSON untuk melatih keterampilan Python JSON
Menggunakan namedtuple dan object_hook untuk Mengonversi data JSON Menjadi Objek Python Kustom
Kita dapat menggunakan parameter After Converting JSON Data into Custom Python Object 1 Emma_3 dari metode After Converting JSON Data into Custom Python Object 1 Emma4 dan After Converting JSON Data into Custom Python Object 1 Emma5. After Converting JSON Data into Custom Python Object 1 Emma_3 adalah fungsi opsional yang akan dipanggil dengan hasil dari dekode literal objek apa pun (dikt). Jadi ketika kita mengeksekusi After Converting JSON Data into Custom Python Object 1 Emma4, nilai pengembalian ________5______3 akan digunakan sebagai pengganti After Converting JSON Data into Custom Python Object 1 Emma2. Dengan menggunakan fitur ini, kita dapat mengimplementasikan decoder khusus
Untuk mengonversi JSON menjadi tipe Python khusus, kita perlu mengikuti yang berikut ini
Seperti yang kita ketahui metode After Converting JSON Data into Custom Python Object 1 Emma5 dan After Converting JSON Data into Custom Python Object 1 Emma4 mengubah JSON menjadi objek After Converting JSON Data into Custom Python Object 1 Emma2 jadi kita perlu membuat fungsi khusus tempat kita dapat mengubah After Converting JSON Data into Custom Python Object 1 Emma2 menjadi tipe Python khusus. dan teruskan fungsi yang baru dibuat ini ke parameter After Converting JSON Data into Custom Python Object 1 Emma_3 dari metode import json from collections import namedtuple from json import JSONEncoder class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJson = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJson) # Parse JSON into an object with attributes corresponding to dict keys. studObj = json.loads(studentJson, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)5. jadi kita bisa mendapatkan tipe khusus pada saat mendekode JSON
Namedtuple adalah class, di bawah modul collections. Seperti objek tipe kamus, ini berisi kunci dan dipetakan ke beberapa nilai. Dalam hal ini, kita dapat mengakses elemen menggunakan kunci dan indeks
Mari kita lihat contoh sederhananya dulu baru kita bisa beralih ke contoh praktisnya. Dalam contoh ini, kami mengonversi data JSON Siswa menjadi jenis Kelas Siswa khusus
import json from collections import namedtuple from json import JSONEncoder def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) #Assume you received this JSON response studentJsonData = '{"rollNumber": 1, "name": "Emma"}' # Parse JSON into an object with attributes corresponding to dict keys. student = json.loads(studentJsonData, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(student.rollNumber, student.name)Keluaran
After Converting JSON Data into Custom Python Object 1 EmmaSeperti yang Anda lihat, kami mengonversi data JSON yang ada dalam format JSON String menjadi objek kustom Python Siswa. Sekarang, kita dapat mengakses anggotanya menggunakan titik (. ) operator
Sekarang, mari kita lihat skenario realtime di mana bekerja dengan Objek Python yang kompleks. Dan kita perlu mengonversi objek Python khusus menjadi JSON. Juga, kami ingin membuat objek Python khusus dari JSON
Dalam contoh ini, kami menggunakan dua kelas import json from collections import namedtuple from json import JSONEncoder class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJson = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJson) # Parse JSON into an object with attributes corresponding to dict keys. studObj = json.loads(studentJson, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)6 dan import json from collections import namedtuple from json import JSONEncoder class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJson = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJson) # Parse JSON into an object with attributes corresponding to dict keys. studObj = json.loads(studentJson, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)7. Kelas import json from collections import namedtuple from json import JSONEncoder class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJson = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJson) # Parse JSON into an object with attributes corresponding to dict keys. studObj = json.loads(studentJson, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)7 adalah anggota kelas import json from collections import namedtuple from json import JSONEncoder class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJson = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJson) # Parse JSON into an object with attributes corresponding to dict keys. studObj = json.loads(studentJson, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)6
- Pertama, kami menyandikan kelas Siswa ke dalam Data JSON
- Kemudian, kami menggunakan data JSON yang sama untuk mendekodekannya menjadi kelas Siswa
Mari kita lihat contohnya sekarang
import json from collections import namedtuple from json import JSONEncoder class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ def customStudentDecoder(studentDict): return namedtuple('X', studentDict.keys())(*studentDict.values()) marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJson = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJson) # Parse JSON into an object with attributes corresponding to dict keys. studObj = json.loads(studentJson, object_hook=customStudentDecoder) print("After Converting JSON Data into Custom Python Object") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)Keluaran
Student JSON { "rollNumber": 1, "name": "Emma", "marks": { "english": 82, "geometry": 74 } } After Converting JSON Data into Custom Python Object 1 Emma 82 74Menggunakan tipe. SimpleNamespace dan object_hook untuk mengonversi data JSON Menjadi Objek Python Kustom
Kita dapat menggunakan Student JSON { "rollNumber": 1, "name": "Emma", "marks": { "english": 82, "geometry": 74 } } After Converting JSON Data into Custom Python Object 1 Emma 82 74_0 sebagai wadah untuk objek JSON. Ini menawarkan keuntungan berikut dibandingkan solusi namedtuple. –
- Waktu eksekusinya lebih sedikit karena tidak membuat kelas untuk setiap objek
- Itu tepat dan sederhana
Dalam contoh ini, kita akan menggunakan Student JSON { "rollNumber": 1, "name": "Emma", "marks": { "english": 82, "geometry": 74 } } After Converting JSON Data into Custom Python Object 1 Emma 82 74_0 dan After Converting JSON Data into Custom Python Object 1 Emma3 untuk mengonversi data JSON menjadi Objek Python kustom
from __future__ import print_function import json from json import JSONEncoder try: from types import SimpleNamespace as Namespace except ImportError: # Python 2.x fallback from argparse import Namespace class Student: def __init__(self, rollNumber, name, marks): self.rollNumber, self.name, self.marks = rollNumber, name, marks class Marks: def __init__(self, english, geometry): self.english, self.geometry = english, geometry class StudentEncoder(JSONEncoder): def default(self, o): return o.__dict__ marks = Marks(82, 74) student = Student(1, "Emma", marks) # dumps() produces JSON in native str format. if you want to writ it in file use dump() studentJsonData = json.dumps(student, indent=4, cls=StudentEncoder) print("Student JSON") print(studentJsonData) # Parse JSON into an custom Student object. studObj = json.loads(studentJsonData, object_hook=lambda d: Namespace(**d)) print("After Converting JSON Data into Custom Python Object using SimpleNamespace") print(studObj.rollNumber, studObj.name, studObj.marks.english, studObj.marks.geometry)Keluaran
Student JSON { "rollNumber": 1, "name": "Emma", "marks": { "english": 82, "geometry": 74 } } After Converting JSON Data into Custom Python Object using SimpleNamespace 1 Emma 82 74Menggunakan decoding objek dari kelas JSONDecoder untuk mengonversi data JSON Menjadi Objek Python Kustom
Kita dapat menggunakan kelas modul json Student JSON { "rollNumber": 1, "name": "Emma", "marks": { "english": 82, "geometry": 74 } } After Converting JSON Data into Custom Python Object 1 Emma 82 74_3 untuk mengkhususkan decoding objek JSON, di sini kita dapat mendekode objek JSON menjadi tipe Python kustom
Kita perlu membuat fungsi baru di kelas yang akan bertanggung jawab untuk memeriksa tipe objek dalam string JSON, setelah mendapatkan tipe yang benar dalam data JSON kita dapat membuat Objek kita
Mari kita lihat contohnya
import json class Student(object): def __init__(self, rollNumber, name, marks): self.rollNumber = rollNumber self.name = name self.marks = marks def studentDecoder(obj): if '__type__' in obj and obj['__type__'] == 'Student': return Student(obj['rollNumber'], obj['name'], obj['marks']) return obj studentObj = json.loads('{"__type__": "Student", "rollNumber":1, "name": "Ault kelly", "marks": 78}', object_hook=studentDecoder) print("Type of decoded object from JSON Data") print(type(studentObj)) print("Student Details") print(studentObj.rollNumber, studentObj.name, studentObj.marks)Keluaran
Type of decoded object from JSON Data <class '__main__.Student'> Student Details 1 Ault kelly 78Gunakan modul jsonpickle untuk mengonversi data JSON menjadi Objek Python khusus
jsonpickle adalah pustaka Python yang dirancang untuk bekerja dengan Objek Python yang kompleks. Anda dapat menggunakan jsonpickle untuk serialisasi dan deserialisasi kompleks Python dan Data JSON. Anda dapat merujuk ke Dokumentasi Jsonpickle untuk detail lebih lanjut
Modul JSON bawaan Python hanya dapat menangani primitif Python. Untuk objek Python khusus apa pun, kita perlu menulis JSONEncoder dan Decoder kita sendiri
Menggunakan jsonpickle kita akan melakukan hal berikut. –
- Pertama, kita akan menyandikan Objek Siswa ke dalam JSON menggunakan jsonpickle
- Kemudian kita akan mendekode Student JSON menjadi Student Object
Sekarang, mari kita lihat contoh jsonpickle untuk mengonversi data JSON Menjadi Objek Kustom Python
import json import jsonpickle from json import JSONEncoder class Student(object): def __init__(self, rollNumber, name, marks): self.rollNumber = rollNumber self.name = name self.marks = marks class Marks(object): def __init__(self, english, geometry): self.english = english self.geometry = geometry marks = Marks(82, 74) student = Student(1, "Emma", marks) print("Encode Object into JSON formatted Data using jsonpickle") studentJSON = jsonpickle.encode(student) print(studentJSON) print("Decode and Convert JSON into Object using jsonpickle") studentObject = jsonpickle.decode(studentJSON) print("Object type is: ", type(studentObject)) print("Student Details") print(studentObject.rollNumber, studentObject.name, studentObject.marks.english, studentObject.marks.geometry)Keluaran
Encode Object into JSON formatted Data using jsonpickle {"marks": {"english": 82, "geometry": 74, "py/object": "__main__.Marks"}, "name": "Emma", "py/object": "__main__.Student", "rollNumber": 1} Decode JSON formatted Data using jsonpickle 1 Emma 82 74Buat Objek baru, dan berikan kamus hasil sebagai peta untuk mengonversi data JSON menjadi Objek Python khusus
Seperti yang kita ketahui After Converting JSON Data into Custom Python Object 1 Emma4 dan After Converting JSON Data into Custom Python Object 1 Emma5 metode mengembalikan objek After Converting JSON Data into Custom Python Object 1 Emma2. kita dapat membuat objek kustom baru dengan meneruskan objek After Converting JSON Data into Custom Python Object 1 Emma2 sebagai parameter ke konstruktor Student Object. saya. e. , kita dapat memetakan objek After Converting JSON Data into Custom Python Object 1 Emma_2 ke objek kustom
After Converting JSON Data into Custom Python Object 1 Emma0Keluaran
After Converting JSON Data into Custom Python Object 1 Emma1Jadi apa yang Anda pikirkan?
Saya ingin mendengar dari Anda. Apa pendapat Anda tentang artikel ini? . Apa pun itu, beri tahu saya dengan meninggalkan komentar di bawah
Juga, coba selesaikan Latihan Python JSON untuk memiliki pemahaman yang lebih baik tentang Bekerja dengan Data JSON dengan Python