Berkas teks biasa menyimpan kalimat, sedangkan data terstruktur seperti daftar catatan membutuhkan format yang menyimpan batas antarbidangnya juga. JavaScript Object Notation (JSON) adalah format teks terstruktur yang menyimpan data dalam pasangan nama dan nilai, dan pustaka System.Text.Json bawaan .NET mengubah objek menjadi teks JSON serta sebaliknya. Proses mengubah objek menjadi teks disebut serialisasi (serialization), sedangkan proses baliknya disebut deserialisasi. Topik ini membahas kelas data sederhana, serialisasi dengan JsonSerializer, opsi WriteIndented, penyimpanan koleksi List(Of Catatan) ke berkas JSON, dan pembacaannya kembali menjadi objek.
Kelas data dan serialisasi pertama#
Serialisasi diawali kelas data dengan properti publik, karena properti itulah dibaca JsonSerializer saat menyusun teksnya. Kelas Catatan berikut menyimpan empat bidang, yaitu nomor, judul, isi, dan waktu pembuatan.
' tidak-dijalankan
Class Catatan
Public Property Id As Integer
Public Property Judul As String
Public Property Isi As String
Public Property WaktuBuat As DateTime
End ClassMetode JsonSerializer.Serialize menerima objek apa pun dan mengembalikan teks JSON-nya. Hanya properti publik yang tampil pada teksnya, sedangkan field dan properti privat diabaikan. Nilai Boolean ditulis sebagai true dan false tanpa huruf kapital, dan teks yang memuat tanda kutip diloloskan otomatis oleh serializer. Nama properti dipertahankan apa adanya, bilangan ditulis tanpa tanda kutip, teks ditulis dengan tanda kutip, dan DateTime diubah menjadi format ISO 8601 seperti 2026-01-05T08:30:00. Program berikut membangun tiga catatan, mencetak JSON padatnya, menyimpan versi berlekuk ke berkas catatan.json, lalu membaca berkas itu kembali menjadi koleksi. Satu kelas data melayani kedua arah, sehingga perubahan strukturnya cukup dilakukan satu kali.
Option Strict On
Imports System.IO
Imports System.Text.Json
Class Catatan
Public Property Id As Integer
Public Property Judul As String
Public Property Isi As String
Public Property WaktuBuat As DateTime
End Class
Module Program
Sub Main()
Dim arsip As New List(Of Catatan) From {
New Catatan With {
.Id = 1,
.Judul = "Rapat awal",
.Isi = "Menyusun jadwal proyek",
.WaktuBuat = New DateTime(2026, 1, 5, 8, 30, 0)},
New Catatan With {
.Id = 2,
.Judul = "Rapat lanjutan",
.Isi = "Meninjau perkembangan",
.WaktuBuat = New DateTime(2026, 1, 12, 9, 0, 0)},
New Catatan With {
.Id = 3,
.Judul = "Evaluasi",
.Isi = "Menilai capaian awal",
.WaktuBuat = New DateTime(2026, 1, 19, 13, 45, 0)}
}
' Serialisasi bawaan menghasilkan JSON padat dalam satu baris
Dim jsonPadat As String = JsonSerializer.Serialize(arsip)
Console.WriteLine(jsonPadat)
Console.WriteLine()
' WriteIndented menata JSON dengan lekukan agar mudah dibaca manusia
Dim pilihan As New JsonSerializerOptions With {.WriteIndented = True}
Dim jsonRapi As String = JsonSerializer.Serialize(arsip, pilihan)
File.WriteAllText("catatan.json", jsonRapi)
Console.WriteLine(jsonRapi)
' Membaca berkas kembali dan mengurai JSON menjadi objek
Dim isiBerkas As String = File.ReadAllText("catatan.json")
Dim arsipKembali As List(Of Catatan) =
JsonSerializer.Deserialize(Of List(Of Catatan))(isiBerkas)
For Each catatan As Catatan In arsipKembali
Console.WriteLine(
$"{catatan.Id} {catatan.Judul} ({catatan.WaktuBuat:yyyy-MM-dd HH:mm})")
Next
End Sub
End Module[{"Id":1,"Judul":"Rapat awal","Isi":"Menyusun jadwal proyek","WaktuBuat":"2026-01-05T08:30:00"},{"Id":2,"Judul":"Rapat lanjutan","Isi":"Meninjau perkembangan","WaktuBuat":"2026-01-12T09:00:00"},{"Id":3,"Judul":"Evaluasi","Isi":"Menilai capaian awal","WaktuBuat":"2026-01-19T13:45:00"}]
[
{
"Id": 1,
"Judul": "Rapat awal",
"Isi": "Menyusun jadwal proyek",
"WaktuBuat": "2026-01-05T08:30:00"
},
{
"Id": 2,
"Judul": "Rapat lanjutan",
"Isi": "Meninjau perkembangan",
"WaktuBuat": "2026-01-12T09:00:00"
},
{
"Id": 3,
"Judul": "Evaluasi",
"Isi": "Menilai capaian awal",
"WaktuBuat": "2026-01-19T13:45:00"
}
]
1 Rapat awal (2026-01-05 08:30)
2 Rapat lanjutan (2026-01-12 09:00)
3 Evaluasi (2026-01-19 13:45)Baris pertama keluaran adalah JSON padat dalam satu baris. Blok kedua adalah isi berkas catatan.json setelah opsi WriteIndented diterapkan, dan tiga baris terakhir membuktikan bahwa teks itu berhasil dikembalikan menjadi List(Of Catatan) dengan nilai yang sama seperti semula.
Lekukan untuk JSON yang mudah dibaca#
Serializer bawaan menghasilkan satu baris panjang karena format itu paling hemat byte. Opsi WriteIndented yang diberi nilai True mengubah perilakunya, yaitu setiap properti ditulis di baris sendiri dengan lekukan dua spasi dan kurung kurawal berjajar. Berkas yang ditulis untuk transfer jaringan biasanya dibiarkan padat, sedangkan berkas yang akan dibaca atau disunting manusia lebih aman ditulis berlekuk. Perbedaannya hanya bentuk, karena kedua hasil itu mengembalikan objek yang identik saat dideserialisasi.
Objek JsonSerializerOptions menampung banyak perilaku lain selain lekukan, misalnya penamaan properti dan penanganan nilai kosong. Satu objek pilihan cukup dibuat sekali, lalu diteruskan ke setiap pemanggilan Serialize yang menginginkan perilaku yang sama. Pola itu menjaga agar seluruh berkas JSON dalam satu aplikasi memiliki bentuk yang konsisten. Lekukan juga mempermudah perbandingan antarversi, karena setiap properti menempati baris sendiri dan alat perbandingan teks menandai baris yang berubah.
Membaca JSON kembali menjadi objek#
Deserialisasi adalah proses balik serialisasi, yaitu teks JSON diurai menjadi objek dengan jenis yang ditentukan. Pemanggilan JsonSerializer.Deserialize(Of List(Of Catatan))(isiBerkas) pada program utama mengembalikan koleksi penuh, sehingga setiap elemennya kembali bertipe Catatan dan propertinya dapat dibaca seperti objek biasa. Pencocokan dilakukan atas nama properti, sehingga kunci JSON tanpa properti padanan dibiarkan dan properti tanpa kunci menerima nilai bawaan. Kesalahan jenis nilai ditangani lebih ketat, karena teks yang diletakkan pada properti bilangan memicu JsonException saat berkas dibaca.
Karena deserialisasi menerima teks dari mana saja, berkas yang sudah disunting dengan tangan tetap dapat dibaca selama strukturnya sah. Kombinasi WriteIndented dan pembacaan kembali menjadi pola yang lazim untuk berkas pengaturan dan arsip kecil, yaitu ditulis berlekuk agar mudah diperiksa, lalu diurai penuh saat program membutuhkannya.
Kesalahan umum#
Kesalahan pertama adalah menyusun teks JSON dengan penggabungan string. Tanda kutip dan baris baru di dalam isi catatan harus diloloskan, dan serializer sudah menangani semuanya, sehingga penggabungan manual hampir selalu menghasilkan JSON yang rusak.
Kesalahan kedua adalah mengganti nama properti kelas tanpa memikirkan berkas lama. Berkas JSON yang dibuat sebelum penggantian tetap memuat nama lama, sehingga properti baru menerima nilai bawaan tanpa pesan error apa pun, misalnya Id yang berakhir bernilai 0. Rencanakan penggantian nama bersama migrasi berkasnya, atau biarkan nama properti tetap stabil.
Kesalahan ketiga adalah menganggap Serialize menyimpan berkas. Metode itu mengembalikan teks JSON, dan berkas baru tersimpan setelah teks itu diteruskan ke File.WriteAllText atau serumpunnya. Kelalaian ini sering tak terlihat karena program berjalan tanpa keluhan, sedangkan arsip yang diharapkan tidak pernah muncul di folder. Tidak ada pesan error untuk kejadian ini karena tidak ada operasi berkas yang dilakukan sama sekali.
Ringkasan#
- JsonSerializer.Serialize mengubah objek dan koleksi menjadi teks JSON, mempertahankan nama properti, dan mengubah DateTime ke format ISO 8601.
- Opsi WriteIndented pada JsonSerializerOptions menghasilkan JSON berlekuk yang mudah dibaca manusia tanpa mengubah isinya.
- JsonSerializer.Deserialize(Of T) mengurai teks menjadi objek, pencocokannya lewat nama properti, kunci yang hilang diisi nilai bawaan, dan jenis yang salah memicu JsonException.
- Teks JSON disimpan ke berkas dengan File.WriteAllText dan dibaca kembali dengan File.ReadAllText.
Referensi#
- JSON serialization and deserialization in .NET — Microsoft Learn — Gambaran pustaka System.Text.Json beserta perilaku dan batasannya.
- How to serialize and deserialize JSON — Microsoft Learn — Panduan Serialize dan Deserialize beserta penggunaan JsonSerializerOptions.
- JsonSerializer Class — Microsoft Learn — Dokumentasi metode Serialize dan Deserialize yang digunakan pada program contoh.
- JsonSerializerOptions.WriteIndented Property — Microsoft Learn — Opsi lekukan yang membentuk JSON yang mudah dibaca.