- 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
- Inlined: objek atau array yang pendek dan sederhana ditampilkan dalam satu baris
- Tingkat nesting yang diizinkan dikendalikan dengan pengaturan
MaxInlineComplexity
- 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
- 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
- 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
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).
Sepertinya bagus kalau ditambahkan ke komentar asli.
Untuk detailnya, lihat fracturedjson-rs GitHub dan paket crates.io.
Komentar penjelasannya ada di sini.
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.
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.
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.
Misalnya, string seperti
"a\u0000b"itu JSON yang valid; jika itu tidak bisa diserialisasi, maka klaim tersebut tidak sepenuhnya berlaku.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.
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.
Versi JavaScript dan wrapper Python juga menyediakan alat CLI yang sama.
Dengan
rcl eAnda bisa melihat format RCL, dan denganrcl jekeluaran 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.
<().-, 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.
Contoh yang terkenal adalah gron dan jstream yang saya buat.
Mungkin akan lebih mudah dipahami jika Anda menambahkan contoh keluaran penggunaan.
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.
Ini berguna dalam situasi debugging ketika kita perlu cepat memahami data bertingkat yang kompleks.
Terutama sering terjadi saat mengerjakan kode integrasi dengan sistem eksternal.
python -m json.tooluntuk membaca data JSON.Jika alat seperti ini bisa menampilkannya lebih baik daripada itu, tentu cukup bernilai.
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.
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.
Idealnya saya seharusnya meninggalkan XML, tetapi karena kendala legacy, tidak ada pilihan lain.