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.

python
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:

text
      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        Bandung

Mari kita telaah baris-baris kuncinya:

  1. Baris 4-17: payload JSON bersarang dua lapis disiapkan sebagai string lalu diparse json.loads menjadi dict Python.
  2. Baris 20-21: json_normalize(data, record_path="pesanan", meta=["toko"]) menghasilkan empat kolom plus kolom toko; field pelanggan menjadi pelanggan.nama dan pelanggan.kota.
  3. 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.