/ Blog/ #php

Mengatasi JSON yang Berantakan

Tayang pada 15 September 2024

Dapat dibaca selama 2 menit

Terkadang API melakukan hal-hal yang diluar nalar dan kita harus mengatasinya sendiri

Penulis belum lama ini melakukan pekerjaan mengonsumsi data dari SNAP API salah satu bank daerah terkemuka, dan mendapatkan hal yang tidak terduga.

Berikut versi sederhana dari payload yang dikembalikan

{
  "result": {
    "code": 0,
    "data": {
      "name": "Bob"
    }
  }
}

Entah kenapa, value properti data tersebut malah berbentuk string JSON:

{
  "result": {
    "code": 0,
    "data": "{\"name\":\"Bob\"}"
  }
}

Selain itu, karakter spasi terlihat pada data saat diulik lebih lanjut, jadi penulis melihat ini:

{
  "result": {
    "code": 0,
    "data": "{\r  \"name\": \"Bob\"\r}"
  }
}

Di aplikasi Codeigniter 4 penulis, ketika mencoba json_decode payload tersebut, malah jadi gagal:

json_decode($payloadBerantakan, true, JSON_THROW_ON_ERROR);
// throws JSONException "Control character error, possibly incorrectly encoded"

Awalnya, penulis pikir karakter \r yang menyebabkan fungsi json_decode mengeluh, ternyata bukan itu masalahnya. Penyebab sebenarnya adalah karakter tab mentah dan itu benar-benar tidak terlihat.

Berdasarkan spesifikasi JSON, karakter ASCII di bawah 32 tidak diizinkan. Oleh karena itu, penulis perlu menghapusnya (dibersihkan dulu) sebelum melakukan decoding JSON. Setelah itu, penulis harus melakukan decoding JSON kedua untung menangani sisaan dari decoding pertama tadi sekaligus assign ke property yang menjadi target perbaikan.

// mengontrol karakter kode desimal asci 0 - 31
$cleanedPayload = preg_replace('/[\x00-\x1F]/', '', $messyPayload);
// decode pertama
$result = json_decode($cleanedPayload, true, flags: JSON_THROW_ON_ERROR);
// lalu lakukan decode kedua di tempat (tepatnya didalam property)
$result['result']['data'] = json_decode($result['result']['data'], true, JSON_THROW_ON_ERROR);

dan voila! akhirnya bisa…