Parsing JSON VClaim BPJS Gak Pake Ribet

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!