membaca-file-json membaca JSON yang sudah berbentuk tabel, sedangkan respons API nyata jarang sebaik itu: objek pelanggan tersarang di dalam objek pesanan, dan field ringkasan berdiri di lapisan terluar. pd.read_json() akan membengkakkan struktur semacam itu menjadi kolom berisi dict, yang tidak bisa langsung dianalisis. Fungsi pd.json_normalize() dirancang untuk bentuk bersarang: fungsi tersebut meratakan setiap lapisan menjadi kolom dengan nama berjalur, sekaligus mengekstrak daftar yang menjadi baris tabel. Chapter ini membahas record_path, meta, dan parameter sep.
record_path dan meta #
Dua parameter pertama menentukan apa yang menjadi baris. record_path menunjuk daftar objek yang akan menjadi baris tabel — pada contoh, daftar pesanan. Parameter meta membawa field di luar daftar itu ke setiap baris, sehingga nama toko di lapisan terluar menempel pada setiap pesanan. Field bersarang seperti pelanggan.nama otomatis diratakan menjadi kolom berjalur dengan pemisah titik. Hasil akhirnya adalah DataFrame datar yang kolomnya langsung siap untuk groupby() dan .str.
import json
import pandas as pd
payload = """
{
"toko": "Nusantara Mart",
"pesanan": [
{"id": "P-101", "pelanggan": {"nama": "Budi", "kota": "Jakarta"}, "total": 145000},
{"id": "P-102", "pelanggan": {"nama": "Siti", "kota": "Bandung"}, "total": 230000}
]
}
"""
data = json.loads(payload)
# record_path menunjuk daftar yang menjadi baris; meta membawa kolom luar
datar = pd.json_normalize(data, record_path="pesanan", meta=["toko"])
print(datar)
# sep mengubah pemisah jalur bersarang dari titik menjadi garis bawah
datar_sep = pd.json_normalize(data["pesanan"], sep="_")
print("\ndengan sep='_':")
print(datar_sep)Output yang Dihasilkan:
id total pelanggan.nama pelanggan.kota toko
0 P-101 145000 Budi Jakarta Nusantara Mart
1 P-102 230000 Siti Bandung Nusantara Mart
dengan sep='_':
id total pelanggan_nama pelanggan_kota
0 P-101 145000 Budi Jakarta
1 P-102 230000 Siti BandungMari kita telaah baris-baris kuncinya:
- Baris 4-17: payload JSON bersarang dua lapis disiapkan sebagai string lalu diparse
json.loadsmenjadi dict Python. - Baris 20-21:
json_normalize(data, record_path="pesanan", meta=["toko"])menghasilkan empat kolom plus kolomtoko; field pelanggan menjadipelanggan.namadanpelanggan.kota. - Baris 24-25:
json_normalize(data["pesanan"], sep="_")menormalisasi daftar tanpa meta, dan pemisah jalur berganti dari titik menjadi garis bawah.
sep dan Kolom Bersarang #
Nama kolom hasil normalisasi mengikuti jalur ke dalam objek: pelanggan.nama berarti field nama di dalam objek pelanggan. Pemisah titik itu kadang mengganggu — beberapa pustaka plotting dan format ekspor menafsirkan titik sebagai jalur akses. Parameter sep="_" mengganti pemisahnya sehingga kolom menjadi pelanggan_nama; kombinasi sep dan max_level mengatur sampai seberapa dalam struktur diratakan. Bila field bersarang memang ingin dibiarkan utuh sebagai dict, parameter record_prefix dan pemeriksaan manual pada kolomnya memberi kendali tambahan.
Alur Lengkap API ke Tabel #
Pola kerja yang lazim berurutan begini: unduh respons dengan requests, parse JSON dengan json.loads atau response.json(), ratakan dengan json_normalize, lalu perbaiki dtype dengan pd.to_datetime dan astype seperti yang diajarkan section ini sejak awal. Respons API yang memuat beberapa daftar — misalnya pesanan yang di dalamnya ada daftar item — bisa dinormalisasi dua kali: lapisan pesanan dahulu, lalu lapisan item dengan meta berisi id pesanan, dan kedua tabel disambung merge pada id tersebut. Dengan begitu struktur JSON apa pun bisa diubah menjadi keluarga tabel relasional yang biasa dipegang pandas.
json_normalize menutup sisi masuk JSON. Chapter berikutnya melanjutkan ke format kolom modern: Parquet yang menyimpan dtype utuh dan menjadi pilihan bawaan untuk data antar pipeline.
Dokumentasi resmi yang relevan: pandas.json_normalize
untuk parameter record_path, meta, sep, dan max_level, serta User Guide: IO tools
yang memuat contoh normalisasi JSON bersarang.