Parsing JSON VClaim BPJS Gak Pake Ribet
Sobat IT RS, siapa yang baru kebagian tugas “ngulik” API BPJS VClaim? Sering pusing sendiri lihat JSON aneh dari response web service? Liat field banyak, struktur nested, kadang malah error “key not found”. Tenang, bukan kamu doang yang pernah dikeroyok API BPJS. MinTIRS dulu juga pertama kali pegang bridging, rasanya mau banting keyboard. Yuk, kita bahas cara parsing JSON VClaim BPJS yang gak bikin mumet, plus contoh code langsung buat pemula yang baru pegang bridging.
Pembahasan ini pakai contoh dari VClaim, pake bahasa Python (karena sering dipakai di RS) dan PHP (karena mayoritas RS kecil menengah masih bertahan di PHP). Tapi konsepnya mirip di bahasa lain. Fokus: cara parsing respons JSON bpjs, ngambil data penting, handling error, sama tips sederhana biar kode gak njelimet. Yuk kupas pelan-pelan.
Kenalan Dulu: Struktur JSON VClaim BPJS
Respons VClaim BPJS biasanya bentuknya begini:
{
"metaData": {
"code": "200",
"message": "OK"
},
"response": {
"peserta": {
"noKartu": "0001301234567",
"nama": "BUDI SANTOSO",
"sex": "L",
"tglLahir": "1980-12-01"
//...masih banyak field lain
}
}
}
Atau kadang error:
{
"metaData": {
"code": "201",
"message": "Data tidak ditemukan"
}
}
- metaData: status, code = 200 (OK), code lain artinya error
- response: data inti, isinya bisa json object, array, kadang kosong
Dasar Parsing JSON: Python & PHP
Python
import json
result_json = '{ "metaData": { "code": "200", "message": "OK" }, "response": { "peserta": { "noKartu": "0001301234567", "nama": "BUDI SANTOSO" } } }'
data = json.loads(result_json)
print(data["metaData"]["code"])
print(data["response"]["peserta"]["nama"])
- json.loads ubah string ke dict
- Ambil data: akses pakai [key]
PHP
$result_json = '{ "metaData": { "code": "200", "message": "OK" }, "response": { "peserta": { "noKartu": "0001301234567", "nama": "BUDI SANTOSO" } } }';
$data = json_decode($result_json, true);
echo $data["metaData"]["code"];
echo $data["response"]["peserta"]["nama"];
- json_decode($json, true) jadi array
- Ambil data: akses pakai ["key"]
Tips Anti Ribet: Step by Step Parsing JSON VClaim
1. Selalu Cek metaData Dulu
Kunci utama: Jangan lanjut ambil data response kalau code bukan 200! Banyak pemula langsung ngoprek field response, malah error karena response bisa kosong kalau code != 200.
Python
if data["metaData"]["code"] == "200":
peserta = data["response"]["peserta"]
print(peserta["nama"])
else:
print("BPJS Error:", data["metaData"]["message"])
PHP
if ($data["metaData"]["code"] === "200") {
$peserta = $data["response"]["peserta"];
echo $peserta["nama"];
} else {
echo "BPJS Error: " . $data["metaData"]["message"];
}
- Pokok e ngene: Cek metaData, code “200” = aman, selain itu stop/handle error
2. Handling Error Key (KeyError/Array Key Not Exist)
Kadang response field response gak ada kalau error. Jangan nekad akses, pasti error “KeyError” di Python atau “Undefined index” di PHP. Solusi: pakai get() atau cek isset dulu.
Python
peserta = data.get("response", {}).get("peserta")
if peserta:
print(peserta.get("nama"))
else:
print("Peserta tidak ditemukan")
PHP
if (isset($data["response"]["peserta"])) {
echo $data["response"]["peserta"]["nama"];
} else {
echo "Peserta tidak ditemukan";
}
- Jangan malas validasi key, API BPJS sering berubah format!
3. Loop Data Jika Array (Contoh: SEP, Riwayat)
Cek peserta kadang 1 object, kadang array. Misal di endpoint monitoring/sep/tglSEP:
{
"metaData": { "code": "200", "message": "OK" },
"response": {
"sep": [
{ "noSep": "12345", "tglSep": "2023-05-01", "ppkPelayanan": "RSUD", ... },
{ "noSep": "67890", "tglSep": "2023-05-02", "ppkPelayanan": "RSUD", ... }
]
}
}
Python
sep_list = data.get("response", {}).get("sep", [])
for sep in sep_list:
print(sep.get("noSep"), sep.get("tglSep"))
PHP
if (isset($data["response"]["sep"])) {
foreach($data["response"]["sep"] as $sep) {
echo $sep["noSep"] . " - " . $sep["tglSep"] . "<br>";
}
}
- Trik: Selalu treat hasil array, walau kadang isinya cuma 1. Hindari “foreach error”/“TypeError”!
Studi Kasus 1: Validasi Nomor Kartu, Cek Status Peserta
Kamu mau cek status peserta dari nomor kartu. Endpoint peserta/nokartu/{nokartu}/tglSEP/{tanggal} respons:
{
"metaData": { "code": "200", "message": "OK" },
"response": {
"peserta": {
"noKartu": "0001301234567",
"nama": "BUDI SANTOSO",
"statusPeserta": {
"keterangan": "AKTIF",
"kode": "0"
}
}
}
}
Ambil nama, status aktif, tampilkan pesan sukses/gagal
Python
def cek_status_peserta(data):
meta = data.get("metaData", {})
if meta.get("code") == "200":
peserta = data.get("response", {}).get("peserta", {})
nama = peserta.get("nama", "-")
status = peserta.get("statusPeserta", {}).get("keterangan", "-")
print(f"Peserta: {nama}, Status: {status}")
else:
print(f"Gagal: {meta.get('message', '-')}")
PHP
function cek_status_peserta($data) {
if ($data["metaData"]["code"] === "200") {
$peserta = $data["response"]["peserta"];
$nama = isset($peserta["nama"]) ? $peserta["nama"] : "-";
$status = isset($peserta["statusPeserta"]["keterangan"]) ? $peserta["statusPeserta"]["keterangan"] : "-";
echo "Peserta: $nama, Status: $status";
} else {
echo "Gagal: " . $data["metaData"]["message"];
}
}
- Tips: Selalu kasih default value (“-“) biar gak error saat field kosong.
Studi Kasus 2: Parsing Riwayat SEP, Tampil di Tabel
Response monitoring SEP:
{
"metaData": { "code": "200", "message": "OK" },
"response": {
"sep": [
{ "noSep": "123", "tglSep": "2023-05-01", "diagnosa": "A00" },
{ "noSep": "124", "tglSep": "2023-05-02", "diagnosa": "B00" }
]
}
}
Python: Dump ke tabel sederhana terminal
sep_list = data.get("response", {}).get("sep", [])
print("No SEP | Tgl SEP | Diagnosa")
for sep in sep_list:
print(f"{sep.get('noSep')} | {sep.get('tglSep')} | {sep.get('diagnosa')}")
PHP: HTML Table
if (isset($data["response"]["sep"])) {
echo "<table border=1><tr><th>No SEP</th><th>Tgl SEP</th><th>Diagnosa</th></tr>";
foreach($data["response"]["sep"] as $sep) {
echo "<tr><td>{$sep['noSep']}</td><td>{$sep['tglSep']}</td><td>{$sep['diagnosa']}</td></tr>";
}
echo "</table>";
}
- Tips: Cek array dulu, bikin tampilan gampang di-scan orang.
Studi Kasus 3: Error Handling, Respon Gak Standard
API BPJS kadang “ngaco”: field “metaData” miss, response null, JSON corrupt. Harus siap try-except/catch error.
Python
import json
try:
data = json.loads(result_json)
code = data["metaData"]["code"]
except Exception as e:
print("Format JSON error:", str(e))
PHP
$data = json_decode($result_json, true);
if ($data === null) {
echo "Format JSON error: " . json_last_error_msg();
} else if (!isset($data["metaData"])) {
echo "Field metaData tidak ditemukan!";
}
- Saran: Selalu tangkap error parsing, log error, jangan ngeblank/no output!
JSON VClaim: Nested Field, Array dalam Array
Contoh response rujukan faskes (bisa array, bisa objek):
{
"metaData": { "code": "200", "message": "OK" },
"response": {
"rujukan": [
{
"noRujukan": "321",
"provPerujuk": { "nama": "RS A", "kode": "0123" },
"poliRujukan": { "nama": "Poli Bedah" }
}
]
}
}
Ambil nama RS perujuk dan nama poli
for rujukan in data.get("response", {}).get("rujukan", []):
nama_rs = rujukan.get("provPerujuk", {}).get("nama", "-")
nama_poli = rujukan.get("poliRujukan", {}).get("nama", "-")
print(nama_rs, nama_poli)
- Penting: Jangan lupa get() nested, bisa null/object kosong.
Trik Lain Parsing JSON BPJS
- Testing dulu respons di Postman, copy-paste JSON ke code. Jangan sok-sokan coding langsung “tanpa contoh”, nanti error terus.
- Selalu print/log semua response (buat log harian, trace kalau BPJS lagi aneh).
- Kalau field sering berubah, wrapping parsing di function sendiri (misal parse_peserta, parse_sep) biar satu titik perbaikan.
- Untuk field tanggal, parsing string ke datetime pakai stdlib (hindari parsing manual, rawan typo).
- Mainkan try/except (Python) atau isset/error handler (PHP) di setiap akses field response.
- Jangan hardcode index array, selalu loop atau cek is_array.
- Kalau response bisa array/object (BPJS kadang gitu), cocokin tipe dulu sebelum diakses, contoh:
# Python
rujukan = data.get("response", {}).get("rujukan")
if isinstance(rujukan, list):
for item in rujukan:
print(item.get("noRujukan"))
elif isinstance(rujukan, dict):
print(rujukan.get("noRujukan"))
# PHP
$rujukan = $data["response"]["rujukan"];
if (isset($rujukan[0])) {
foreach ($rujukan as $item) {
echo $item["noRujukan"];
}
} else {
echo $rujukan["noRujukan"];
}
Antipattern: Hal yang Bikin Parsing Makin Ribet (Harus Dihindari)
- Langsung pakai field tanpa cek code → sering error kalau response error/field kosong
- Parsing manual pakai substring/split → zaman batu, rawan bug & kepleset
- Akses nested field tanpa cek parent → error KeyError/Notice PHP
- Tidak log error dari BPJS → orang lain gak bisa tracing errornya apa
- Hardcode structure → kalau BPJS ubah struktur, semua parsing bubar
Best Practice: Template Function Parsing BPJS
Biar hidup tenang, bikin function reusable untuk parsing response BPJS:
Python
def get_data_bpjs(json_response, path=[]):
try:
data = json.loads(json_response) if isinstance(json_response, str) else json_response
meta = data.get("metaData", {})
if meta.get("code") != "200":
return None, meta.get("message", "Unknown Error")
d = data.get("response", {})
for p in path:
d = d.get(p, {})
return d, None
except Exception as e:
return None, str(e)
# contoh pakai:
peserta, err = get_data_bpjs(result_json, ["peserta"])
if peserta:
print(peserta.get("nama"))
else:
print("Error:", err)
PHP
function get_data_bpjs($json_response, $path=array()) {
$data = is_string($json_response) ? json_decode($json_response, true) : $json_response;
if ($data === null) return array(null, "JSON Error: " . json_last_error_msg());
if (!isset($data["metaData"]) || $data["metaData"]["code"] !== "200") {
return array(null, isset($data["metaData"]["message"]) ? $data["metaData"]["message"] : "Unknown error");
}
$d = isset($data["response"]) ? $data["response"] : array();
foreach($path as $p) {
$d = isset($d[$p]) ? $d[$p] : array();
}
return array($d, null);
}
// contoh pakai:
list($peserta, $err) = get_data_bpjs($result_json, array("peserta"));
if ($peserta) {
echo $peserta["nama"];
} else {
echo "Error: $err";
}
- Inti: Parsing jadi satu fungsi, akses field tinggal sebut path, error handling masuk function juga.
Debugging: Cara Cepat Cek JSON BPJS Saat Error
- Salin response ke JSON Validator online (jsonlint, jqplay) buat cek struktur
- Print/log raw response ke file, jangan hanya tampilkan error message
- Cek apakah response object atau array, banyak kasus BPJS kadang kirim object, kadang array
- Kalau error “key not found”, cek spelling dan case sensitive. Contoh “noKartu” != “nokartu”
- Tes di Postman dulu, bandingkan hasil di code
Kesimpulan Praktis ala Lapangan
- Cek selalu metaData code sebelum parsing response
- Handle error key dengan try/except (Python) atau isset (PHP)
- Loop array, default value itu wajib, nested field pake get()
- Bikin function reusable parsing biar gak nulis ulang terus-menerus
- Debug pake log, jangan males print semua response waktu error
Strong: parsing JSON BPJS = seringan mungkin, jangan baper sama struktur API. Error? Telusuri pelan-pelan. Sering latihan parsing, lama-lama hapal polanya. Pusing? Konsultasi ke peer IT RS lain, jangan ditanggung sendiri, Sobat IT RS!
PETIRS