Perilaku default JsonSerializer belum tentu sesuai kontrak API yang kita hadapi: endpoint mungkin mewajibkan camelCase, sedangkan manusia membaca payload dengan lebih nyaman bila diindentasi. JsonSerializerOptions menjadi titik konfigurasi tunggal untuk kebutuhan tersebut; instance options dikirim sebagai argumen kedua method Serialize maupun Deserialize.

Opsi yang Sering Dipakai #

  • PropertyNamingPolicy = JsonNamingPolicy.CamelCase: mengubah nama properti menjadi camelCase saat menulis.
  • WriteIndented = true: menambahkan indentasi dua spasi agar payload mudah dibaca.
  • PropertyNameCaseInsensitive = true: pencocokan nama saat membaca tidak lagi sensitif huruf besar-kecil.
  • DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull: properti null tidak ditulis sama sekali.

Contoh Penggunaan Opsi #

csharp
var opsi = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    WriteIndented = true
};

var produk = new ProdukJson { Nama = "Kopi Gayo", Harga = 45000 };
Console.WriteLine(JsonSerializer.Serialize(produk, opsi));

string jsonCamel = """{"nama":"Kopi Gayo","harga":45000}""";
ProdukJson hasil = JsonSerializer.Deserialize<ProdukJson>(jsonCamel, opsi);
Console.WriteLine($"{hasil.Nama} - {hasil.Harga}");

Output yang Dihasilkan:

text
{
  "nama": "Kopi Gayo",
  "harga": 45000
}
Kopi Gayo - 45000

Mari kita bedah baris demi baris:

  1. Baris 1-6 (new JsonSerializerOptions ...): object options menyimpan dua keputusan: penamaan camelCase dan indentasi.
  2. Baris 8 (Serialize(produk, opsi)): serializer menulis "nama" dan "harga" dengan huruf kecil, satu anggota per baris.
  3. Baris 10-11 (Deserialize ... , opsi): opsi yang sama dipakai saat membaca; JSON camelCase kini dipetakan penuh ke properti PascalCase tanpa data hilang.
  4. Baris 12 (Console.WriteLine ...): nilai Kopi Gayo - 45000 membuktikan round-trip dua arah dengan satu konfigurasi; class tidak perlu disentuh sama sekali.

Opsi lain tetap dapat ditambahkan ke object yang sama, misalnya DefaultIgnoreCondition untuk menghilangkan properti null dari payload. Prinsipnya satu: seluruh keputusan bentuk JSON berada di satu tempat, sehingga perubahan kontrak cukup dilakukan pada satu titik dan tidak tersebar di seluruh kode pemanggil.