Mengonversi respons json ke kamus python

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
445

Deserialisasi 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

StudentDict = {"id": 22, "name": "Emma"}
MarksList = [StudentDict, 78, 56, 85, 67]
_

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 Emma
2

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

Mengonversi respons json ke kamus python
Mengonversi respons json ke kamus python
Dijelaskan cara Mengonversi JSON menjadi Objek Python kustom

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 Emma
4 dan
After Converting JSON Data into Custom Python Object
1 Emma
5.
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 Emma
4, nilai pengembalian ________5______3 akan digunakan sebagai pengganti
After Converting JSON Data into Custom Python Object
1 Emma
2. 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 Emma
5 dan
After Converting JSON Data into Custom Python Object
1 Emma
4 mengubah JSON menjadi objek
After Converting JSON Data into Custom Python Object
1 Emma
2 jadi kita perlu membuat fungsi khusus tempat kita dapat mengubah
After Converting JSON Data into Custom Python Object
1 Emma
2 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 Emma

Seperti 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 74

Menggunakan 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 Emma
3 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 74

Menggunakan 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 78

Gunakan 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 74

Buat 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 Emma
4 dan
After Converting JSON Data into Custom Python Object
1 Emma
5 metode mengembalikan objek
After Converting JSON Data into Custom Python Object
1 Emma
2. kita dapat membuat objek kustom baru dengan meneruskan objek
After Converting JSON Data into Custom Python Object
1 Emma
2 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 Emma
0

Keluaran

After Converting JSON Data into Custom Python Object
1 Emma
1

Jadi 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

Bagaimana cara mengonversi respons JSON ke kamus?

Konversikan JSON ke kamus .
Impor modul json dalam program
Buka contoh file JSON yang telah kita buat di atas
Ubah data file menjadi kamus menggunakan json. .
Periksa jenis nilai yang dikembalikan oleh json. .
Cetak kuncinya. pasangan nilai di dalam kamus Python menggunakan for loop

Bagaimana cara mengonversi file JSON ke dict Python?

String JSON ke Kamus Python . json. load(data_JSON) membuat kamus baru dengan pasangan kunci-nilai dari string JSON dan mengembalikan kamus baru ini. use the loads() function of the json module, passing the string as the argument. json. loads(data_JSON) creates a new dictionary with the key-value pairs of the JSON string and it returns this new dictionary.

Bagaimana Anda mengubah objek respons ke kamus dengan Python?

Ini bekerja dengan memuat objek tanggapan menggunakan. get() fungsi. Kami kemudian menerapkan. json() ke objek respons untuk mengubahnya menjadi kamus Python .

Bagaimana cara mengonversi respons JSON ke daftar dengan Python?

Untuk mengonversi String JSON ke Daftar Python, gunakan json. memuat() fungsi . fungsi beban () mengambil string JSON Array sebagai argumen dan mengembalikan Daftar Python.