Data terstruktur disajikan dalam format standar yang disebut JSON (JavaScript Object Notation). Meskipun JSON berevolusi dari bahasa pemrograman JavaScript, sekarang menjadi cara yang umum bagi sistem untuk bertukar data. Sebagian besar API kontemporer menerima kueri JSON dan menghasilkan balasan JSON, oleh karena itu memiliki pemahaman yang kuat tentang karakteristik format sangat membantu.

Artikel ini akan mendefinisikan JSON, menjelaskan bagaimana JSON mengekspresikan berbagai jenis data, dan menjelaskan bagaimana Anda dapat membuat dan menggunakannya dalam bahasa pemrograman yang terkenal. Kami juga akan membahas beberapa kelemahan JSON dan pengganti yang tersedia.


Dasar JSON

Douglas Crockford awalnya membuat JSON sebagai format tanpa kewarganegaraan untuk mentransfer data antara browser dan server. Setelah halaman awal dimuat, situs web mulai mengambil data tambahan secara asinkron dari server mereka di awal tahun 2000-an. JSON, format berbasis teks yang diturunkan dari JavaScript, mempermudah aplikasi ini untuk mengumpulkan dan menggunakan data. Pada 2013, spesifikasi akhirnya dikodifikasikan sebagai ECMA-404.

JSON dikomunikasikan secara eksklusif sebagai string. Banyak tipe data fundamental, seperti angka, boolean, array, dan objek, dapat diturunkan dari string ini. Hirarki dan hubungan antara objek dengan demikian dapat dipertahankan selama transmisi dan kemudian dipasang kembali dengan cara yang sesuai untuk lingkungan pemrograman di sisi penerima.


Contoh JSON Dasar

Ini adalah representasi JSON dari posting blog:

{
    "id": 1001,
    "title": "What is JSON?",
    "author": {
        "id": 1,
        "name": "James Walker"
    },
    "tags": ["api", "json", "programming"],
    "published": false,
    "publishedTimestamp": null
}

Semua tipe data JSON ditampilkan dalam contoh ini. Ini juga menunjukkan bagaimana data berformat JSON ringkas, yang merupakan salah satu kualitas yang membuatnya begitu menggoda untuk digunakan dalam API. Berbeda dengan bentuk yang lebih bertele-tele seperti XML, JSON juga cukup sederhana untuk dipahami dalam bentuk mentahnya.


Tipe Data JSON

JSON secara native dapat mewakili enam jenis data berikut:

  • String - String ditulis dalam tanda kutip ganda, dan garis miring terbalik dapat digunakan untuk keluar dari karakter.
  • Angka dinyatakan sebagai angka dan tidak diapit tanda kutip. Untuk menunjukkan pelampung, Anda dapat menyertakan komponen fraksional. Ketika tidak ada titik desimal, sebagian besar implementasi penguraian JSON mengambil nilai menjadi bilangan bulat.
  • Nilai literal true dan false didukung untuk boolean.
  • Null - Nilai yang kosong atau hilang dapat diwakili oleh nilai literal null.
  • Daftar sederhana disebut array dan diidentifikasi dengan tanda kurung siku. Elemen daftar dipisahkan satu sama lain dengan koma. Sejumlah elemen dapat dimasukkan dalam array, dan tipe data apa pun yang tersedia dapat digunakan.
  • Kurung keriting digunakan untuk membangun objek. Mereka terdiri dari sejumlah pasangan kunci-nilai dengan kunci berupa string yang diapit tanda kutip ganda. Setiap tipe data yang dapat diakses dapat digunakan sebagai nilai dari setiap kunci. Objek dapat disarangkan untuk membangun hierarki kaskade. Setiap nilai harus diikuti dengan koma untuk menunjukkan akhir dari key-value pair tersebut.

Tipe data ini secara otomatis diubah menjadi struktur bahasa yang tepat oleh parser JSON. Misalnya, Anda tidak perlu secara manual mentransmisikan id ke bilangan bulat. Ini cukup untuk menguraikan teks JSON lengkap untuk mengonversi nilai kembali ke format data aslinya.


Semantik dan Validasi

Saat menyandikan data, Anda harus mematuhi persyaratan JSON tertentu. Konsumen tidak akan dapat mengurai string yang mengikuti tata bahasa.

Anda harus memperhatikan tanda kutip yang mengelilingi string dan kunci objek. Tanda koma juga harus disertakan setelah setiap entri dalam objek atau larik. Namun, JSON tidak mengizinkan tanda koma setelah entri terakhir—secara tidak sengaja menambahkan satu koma sering menjadi penyebab masalah validasi. Sebagian besar editor teks akan membantu Anda mengidentifikasi kesalahan dengan menyoroti masalah sintaksis.

Terlepas dari masalah yang sering terjadi ini, JSON adalah salah satu format data paling sederhana untuk dibuat secara manual. Begitu mereka terbiasa dengannya, kebanyakan orang menganggap sintaksisnya cepat dan berguna. Secara umum, JSON kurang rentan terhadap kesalahan dibandingkan XML, yang sering mengalami masalah karena ketidaksesuaian tag awal dan akhir, deklarasi skema yang salah, dan masalah pengkodean karakter.


Bekerja Dengan JSON

Sebagian besar bahasa komputer sekarang mendukung JSON. Berikut beberapa konteks umum dan cara berinteraksi dengan data JSON di dalamnya.

JavaScript

Untuk menyandikan dan mendekode string JSON dengan JavaScript, gunakan metode JSON.stringify() dan JSON.parse() :

const post = {
    id: 1001,
    title: "What Is JSON?",
    author: {
        id: 1,
        name: "James Walker"
    }
};
 
const encodedJson = JSON.stringify(post);
 
// {"id": 1001, "title": "What Is JSON?", ...}
console.log(encodedJson);
 
const decodedJson = JSON.parse(encodedJson);
 
// James Walker
console.log(decodedJson.author.name);

PHP

Fungsi yang setara dalam PHP adalah json_encode() dan json_decode():

$post = [
    "id" => 1001,
    "title" => "What Is JSON?",
    "author" => [
        "id" => 1,
        "name" => "James Walker"
    ]
];
 
$encodedJson = json_encode($post);
 
// {"id": 1001, "title": "What Is JSON?", ...}
echo $encodedJson;
 
$decodedJson = json_decode($encodedJson, true);
 
// James Walker
echo $decodedJson["author"]["name"];

Python

Python menyediakan json.dumps() dan json.loads() untuk serialisasi dan deserialisasi masing-masing:

import json
 
post = {
    "id": 1001,
    "title": "What Is JSON?",
    "author": {
        "id": 1,
        "name": "James Walker"
    }
}
 
encodedJson = json.dumps(post)
 
# {"id": 1001, "title": "What Is JSON?", ...}
print(encodedJson)
 
decodedJson = json.loads(encodedJson)
 
# James Walker
print(decodedJson["author"]["name"])

Ruby

Ruby menawarkan JSON.generate dan JSON.parse:

require "json"
 
post = {
    "id" => 1001,
    "title" => "What Is JSON?",
    "author" => {
        "id" => 1,
        "name" => "James Walker"
    }
}
 
encodedJson = JSON.generate(post)
 
# {"id": 1001, "title": "What Is JSON?", ...}
puts encodedJson
 
decodedJson = JSON.parse(encodedJson)
 
# James Walker
puts decodedJson["author"]["name"]

JSON Limitations

JSON adalah format ringkas yang menekankan komunikasi nilai-nilai yang disertakan dalam struktur data Anda. Ini membuatnya mudah untuk dikerjakan dan cepat diurai, tetapi ada kelemahan yang bisa membuat frustasi. Berikut adalah beberapa masalah yang paling mendesak.


Tidak ada komentar

Komentar tidak diperbolehkan dalam data JSON. Kurangnya anotasi membuat segalanya menjadi kurang jelas dan memaksa Anda untuk menyimpan informasi di tempat lain. Oleh karena itu, JSON mungkin tidak sesuai untuk pengaturan seperti file konfigurasi, di mana perubahan cenderung jarang terjadi dan tujuan bidang mungkin tidak jelas.


Tidak ada Skema

Anda tidak dapat menentukan skema untuk data Anda di JSON. Misalnya, tidak ada mekanisme untuk menjamin bahwa kolom numerik "id" adalah yang diperlukan. Struktur data cacat yang tidak disengaja dapat terjadi akibat hal ini.


Tidak Ada Referensi

Bidang dalam struktur data tidak dapat membuat referensi ke nilai lain. Pengulangan dari ini sering meningkatkan ukuran file. Untuk menggunakan contoh posting blog sebelumnya sebagai contoh, Anda dapat memiliki daftar artikel blog yang terlihat seperti ini:

{
    "posts": [
        {
            "id": 1001,
            "title": "What is JSON?",
            "author": {
                "id": 1,
                "name": "James Walker"
            }
        },
        {
            "id": 1002,
            "title": "What is SaaS?",
            "author": {
                "id": 1,
                "name": "James Walker"
            }
        }
    ]
}

Meski materi yang terkait dengan objek itu harus direplikasi, kedua entri tersebut ditulis oleh penulis yang sama. Di dunia yang sempurna, implementasi parser JSON akan dapat menghasilkan struktur yang ditampilkan di atas dari data yang terlihat seperti ini:

{
    "posts": [
        {
            "id": 1001,
            "title": "What is JSON?",
            "author": "{{ .authors.james }}"
        },
        {
            "id": 1002,
            "title": "What is SaaS?",
            "author": "{{ .authors.james }}"
        }
    ],
    "authors": {
        "james": {
            "id": 1,
            "name": "James Walker"
        }
    }
}

Standar JSON saat ini tidak memungkinkan untuk ini.


Tidak Ada Tipe Data Tingkat Lanjut

Keenam tipe data yang tersedia kehilangan banyak jenis nilai yang populer. Anda harus memilih format Anda sendiri untuk data ini karena tanggal, waktu, dan titik geografis tidak didukung secara native oleh JSON.

Kasus tepi dan perbedaan yang mengganggu dihasilkan dari ini. Anda harus melacak kapan menggunakan setiap format jika program Anda menangani stempel waktu sebagai string, seperti 2022-07-01T12:00:00+00:00, tetapi API eksternal menampilkan waktu sebagai detik setelah zaman Unix ( 1657287000).


Alternatif JSON

Pengganti JSON yang paling banyak digunakan adalah YAML. Ini adalah superset format dengan referensi yang didukung, presentasi yang lebih mudah dipahami, dan tipe data kustom. Ini bertujuan untuk mengatasi sebagian besar masalah kegunaan dengan JSON.

Penggunaan YAML secara luas dalam file konfigurasi, serta di DevOps, IaC, dan alat observasi Ini tidak biasa digunakan sebagai format pertukaran data API. Karena kerumitannya yang relatif, YAML kurang ramah pengguna untuk pemula. Kesalahan sintaks kecil dapat menyebabkan masalah penguraian yang membingungkan.

Pesaing JSON lain yang sedang berkembang, buffer protokol (protobuf), dibuat untuk membuat serialisasi data terstruktur. Deklarasi tipe data, bidang wajib, dan kompatibilitas untuk sebagian besar bahasa pemrograman populer adalah semua fitur protobuf. Teknik ini menjadi lebih disukai sebagai metode transmisi data yang lebih efektif melalui jaringan.


Ringkasan

JSON adalah format berbasis teks untuk representasi data yang dapat menyimpan enam kategori utama data. Semua bahasa pemrograman utama sekarang mendukung JSON, yang telah memantapkan dirinya sebagai standar de facto untuk sebagian besar REST API yang dibuat selama dua dekade sebelumnya.

Kesederhanaan JSON berkontribusi pada daya tariknya, tetapi juga membatasi apa yang dapat Anda lakukan dengan format tersebut. Beberapa aplikasi mungkin menemukan bahwa mereka melebihi kemampuan JSON karena tidak adanya dukungan untuk skema, komentar, referensi objek, dan tipe data khusus. Masalah ini telah diatasi oleh alternatif yang lebih baru seperti YAML dan Protobuf, tetapi XML masih merupakan pesaing untuk aplikasi yang perlu mendeskripsikan skema data dan tidak mempermasalahkan verbositasnya.