6 poin oleh GN⁺ 2026-01-03 | 1 komentar | Bagikan ke WhatsApp
  • Kumpulan utilitas pemformatan yang menata data JSON agar mudah dibaca manusia sambil tetap mempertahankan bentuk yang ringkas
  • Array dan objek direpresentasikan dalam satu baris sebisa mungkin, dan bila strukturnya mirip akan diratakan seperti tabel
  • Mendukung pelestarian komentar, sehingga komentar yang tidak ada dalam standar JSON tetapi umum di lingkungan nyata tetap dipertahankan
  • Dapat digunakan di berbagai lingkungan seperti library .NET, paket JavaScript/TypeScript, ekstensi VS Code, dan formatter browser
  • Alat yang meningkatkan keterbacaan formatter JSON konvensional untuk membantu pemahaman visual developer dan analis data

Gambaran Umum FracturedJson

  • FracturedJson adalah kumpulan utilitas yang menghasilkan format JSON yang ringkas namun tetap mudah dibaca manusia
    • Array dan objek akan dicetak dalam satu baris jika tidak terlalu panjang atau kompleks
    • Beberapa baris dengan struktur serupa akan disejajarkan per field dalam bentuk tabel
    • Array panjang akan ditampilkan dalam beberapa baris, dengan beberapa item ditempatkan pada satu baris
  • Format keluaran dapat dikendalikan melalui berbagai pengaturan, namun pada banyak kasus hasil yang enak dibaca sudah didapat dengan pengaturan bawaan
  • Tersedia sebagai halaman formatter berbasis browser, library .NET, paket JavaScript/TypeScript, dan ekstensi VS Code
  • Opsi untuk Python juga dijelaskan secara terpisah

Motivation

  • Sebagian besar library JSON hanya menyediakan dua format
    • Minified JSON: efisien tetapi sulit dibaca manusia
    • Beautified/Indented JSON: terlalu melebar sehingga sulit dipindai dengan cepat
  • FracturedJson memformat data seolah ditulis langsung oleh manusia
    • Kecuali bila terlalu kompleks atau panjang, container dipertahankan dalam satu baris
    • Array atau objek yang serupa akan diratakan dalam bentuk tabel

Cara Kerja (How It Works)

  • FracturedJson menggunakan empat jenis pemformatan
    1. Inlined: objek atau array yang pendek dan sederhana ditampilkan dalam satu baris
      • Tingkat nesting yang diizinkan dikendalikan dengan pengaturan MaxInlineComplexity
    2. Compact Multiline Array: beberapa item ditempatkan dalam satu baris, tetapi keseluruhannya dibagi ke beberapa baris
      • Toleransi nesting diatur dengan MaxCompactArrayComplexity, dan dapat dinonaktifkan dengan -1
    3. Table: item dengan struktur serupa disejajarkan dalam bentuk kolom
      • Jika container internal terlalu kompleks, hanya sebagian yang akan dipadatkan
      • Dapat dikendalikan dengan MaxTableRowComplexity dan TableCommaPlacement
    4. Expanded: jika tidak memenuhi kondisi di atas, setiap item ditampilkan dengan indentasi di beberapa baris

Penanganan Komentar

  • Standar JSON tidak mengizinkan komentar, tetapi FracturedJson mendukung pelestarian komentar
    • Komentar dipertahankan bersama elemen terkait, dan baik komentar multi-baris maupun komentar inline dapat ditangani

Discussions

  • Menyediakan ruang GitHub Discussions untuk pertanyaan pengguna, masukan, dan saran
  • Dapat digunakan untuk diskusi terkait proyek dan usulan perbaikan

1 komentar

 
GN⁺ 2026-01-03
Komentar Hacker News
  • Saat ini ada dua implementasi proyek ini yang masih dipelihara.
    Salah satunya versi C# (FracturedJson .NET Library), dan yang lainnya versi TypeScript/JavaScript (FracturedJsonJs).
    Dulu juga ada versi Python murni, tetapi sekarang sudah tidak dipelihara dan digantikan oleh wrapper Python yang membungkus kode C# (fractured-json).
    Versi Python ini menyebutkan bahwa ia memerlukan runtime .NET, jadi kekurangannya adalah sulit dipasang hanya dengan pip install.
    Menurut saya, ini kesempatan bagus untuk membuat conformance suite yang independen terhadap bahasa — yakni sekumpulan pengujian berbasis data untuk memverifikasi apakah berbagai implementasi berperilaku sama.
    Sebagai referensi, versi Python lama sebenarnya sudah menggunakan bentuk pengujian seperti ini (data uji compact-json).

    • Saya baru saja mem-porting-nya ke Rust, dan berencana memeliharanya ke depan.
      Sepertinya bagus kalau ditambahkan ke komentar asli.
      Untuk detailnya, lihat fracturedjson-rs GitHub dan paket crates.io.
      Komentar penjelasannya ada di sini.
    • Ini ide bagus, tetapi saya rasa sulit untuk melangkah lebih jauh dari test case hingga jaminan kesetaraan program.
    • Ini nyaris seperti fungsi murni, jadi sangat mudah menulis test harness untuknya.
    • Pengujian berbasis data sangat efektif untuk membangun kepercayaan terhadap library.
      html5lib-tests atau xss-bench yang saya buat juga contoh seperti itu.
  • Saya membuat versi yang di-porting ke Rust, dan lewat alat CLI JSON bisa diformat ke tata letak ini.
    Bisa dipasang dari fracturedjson-rs dan paket crates.io (cargo install fracturedjson).
    Menyediakan berbagai opsi, dan memungkinkan kontrol yang rinci atas cara penanganan komentar, gaya indentasi, batas lebar baris, dan sebagainya.

    • Versi hasil porting juga merupakan karya turunan, jadi penandaan hak cipta penulis asli harus tetap dipertahankan.
  • Proyek ini benar-benar keren.
    Saya suka arah yang membuat JSON lebih mudah dibaca manusia.
    Sebaliknya, saya sedang mengembangkan bonjson yang membuat JSON lebih ramah mesin.
    Ia memiliki fungsi dan batasan yang sepenuhnya sama dengan JSON, tetapi bisa dibaca dan ditulis 35 kali lebih cepat.
    Tidak ada tipe atau fitur baru; ia hanya melakukan persis apa yang bisa dilakukan JSON.

    • JSON adalah notasi yang sederhana, jadi menurut saya dibutuhkan model data terstruktur.
      Misalnya, lebar bit angka atau pembedaan antara integer dan floating point tidak dinyatakan dengan jelas.
      Jika model seperti itu ada, pemetaan 1:1 antar representasi akan dimungkinkan.
      Saya sedang menulis artikel ini terkait topik tersebut.
    • Menarik, tetapi dibanding klaim “bisa melakukan semua yang bisa dilakukan JSON”, batasan keamanan ini agak mengejutkan.
      Misalnya, string seperti "a\u0000b" itu JSON yang valid; jika itu tidak bisa diserialisasi, maka klaim tersebut tidak sepenuhnya berlaku.
    • Saya penasaran apa yang mendorong Anda membuat ini.
      Saya pernah membuat serializer yang menyimpan/memuat JSON dan file biner melalui antarmuka yang sama.
      Dalam pengalaman saya, JSON adalah format yang punya banyak batasan dan sedikit kelebihan.
      Jadi saya mengubahnya menjadi format longgar yang memperbolehkan koma, titik dua, dan tanda kutip dihilangkan, serta mendukung string multiline dan komentar.
      Saya harap kita berhenti berpura-pura bahwa JSON selalu format yang “mudah dibaca manusia”.
      Kita butuh alternatif standar untuk lingkungan yang tidak berpusat pada JSON.
    • Ini mengingatkan saya pada Lite3 yang baru-baru ini muncul.
    • Saya penasaran bagaimana rasio kompresinya.
  • Mengejutkan.
    Saya juga pernah mengimplementasikan fungsi serupa dalam sekitar 200 baris Python, tetapi tidak tahu ternyata sudah ada library seperti ini.

  • Saya penasaran apakah ada opsi untuk menerima input pipe seperti jq.

    • Jika melihat kode CLI C# di repositori, input/output standar atau file bisa ditentukan.
      Versi JavaScript dan wrapper Python juga menyediakan alat CLI yang sama.
    • RCL secara default melakukan pretty-print.
      Dengan rcl e Anda bisa melihat format RCL, dan dengan rcl je keluaran JSON.
      Memang tidak ada perataan tabel seperti FracturedJson, tetapi ia menggunakan algoritma Philip Wadler's A Prettier Printer sehingga pemenggalan baris dilakukan otomatis sesuai lebar.
    • Anda juga bisa memprosesnya dengan membuat file sementara memakai substitusi proses <().
    • Dalam kebanyakan kasus, jika nama file input ditentukan sebagai -, maka bisa dibaca dari stdin.
  • Saya membuat formatter JSON bernama Virtuous, dan ini begitu mengesankan sampai membuat saya ingin meninggalkan formatter saya sendiri.
    Ini benar-benar pekerjaan yang luar biasa.

  • Saya membuat skrip Groovy bernama “mommyjson”.
    Alih-alih mempertahankan format JSON, ia menampilkan hubungan induk dari setiap elemen (indeks array, nama objek, dan sebagainya) dalam satu baris, sehingga posisi data bisa dipahami secara intuitif.
    Lihat kode
    Karena Groovy tidak populer, saya berharap akan ada port Python.

    • Ide yang bagus! Dari adanya beberapa alat seperti ini, tampaknya ini memang fungsi yang jelas dibutuhkan orang.
      Contoh yang terkenal adalah gron dan jstream yang saya buat.
      Mungkin akan lebih mudah dipahami jika Anda menambahkan contoh keluaran penggunaan.
    • Saya penasaran apakah ada contoh keluarannya.
  • Saya ragu JSON memang format yang benar-benar perlu dibuat lebih mudah dibaca manusia.
    Ada banyak cara yang lebih baik untuk menampilkan data kepada pengguna, dan menurut saya JSON memang seharusnya dipakai untuk pertukaran data antar sistem.

    • Alasan orang biasanya memakai alat seperti ini adalah ketika tidak ada skema yang jelas atau alat visualisasi.
      Ini berguna dalam situasi debugging ketika kita perlu cepat memahami data bertingkat yang kompleks.
      Terutama sering terjadi saat mengerjakan kode integrasi dengan sistem eksternal.
    • Saya juga sering memakai jq atau python -m json.tool untuk membaca data JSON.
      Jika alat seperti ini bisa menampilkannya lebih baik daripada itu, tentu cukup bernilai.
    • Jika unsur yang bisa dibaca manusia dibuang, JSON menjadi encoding yang tidak efisien.
      Pada akhirnya kelebihan JSON adalah bahwa ia bisa dibaca manusia dan mesin, jadi untuk debugging tetap ada gunanya.
  • Saya sangat menyukai ide ini.
    Alasan adopsinya lambat saat ini kebanyakan karena kurangnya dukungan untuk banyak bahasa dan package manager (seperti homebrew).
    Jika library .NET dikompilasi menjadi shared library yang kompatibel dengan C, banyak bahasa akan bisa memakainya dengan mudah.

  • Pendekatan yang menarik.
    Akan bagus jika formatter kode juga bekerja seperti ini.
    Formatter saat ini terlalu kaku sehingga sulit memahami strukturnya.

    • Saya membuat formatter C++, dan hanya memakai dua jenis objek: tabel perataan tab dan blok satu baris.
      Komentar disejajarkan ke kanan agar tersusun rapi.
      Dengan struktur seperti ini, blok switch-case atau tabel makro juga bisa dengan mudah disejajarkan secara 2D.
      Lapisan dasarnya saya koding hanya dalam satu jam, dan sekarang saya sedang merancang agar blok bisa dideteksi otomatis dengan menggabungkan LSP dan code observation.
    • Dulu saya pernah membuat formatter XML sendiri agar tampil seperti tabel.
      Idealnya saya seharusnya meninggalkan XML, tetapi karena kendala legacy, tidak ada pilihan lain.