@StingyJack: Untuk menjelaskan hal-hal yang mungkin tidak jelas, atau apa pun yang dilakukan orang dengan komentar. Saya untuk satu sering memiliki komentar dalam file data. XML, file ini, dan banyak format lainnya menyertakan ketentuan untuk komentar.
Michael Burr
24
Jika Anda, seperti saya, bertanya-tanya apakah //commentsboleh untuk kasus penggunaan tertentu dari file konfigurasi Sublime Text, jawabannya adalah ya (pada versi 2). Sublime Text tidak akan mengeluh tentang itu, setidaknya, sedangkan itu akan mengeluh tentang {"__comment": ...}di konsol, karena itu adalah bidang yang tidak terduga.
driftcatcher
8
dan mungkin ini adalah salah satu alasan mengapa TOML diciptakan ..
Alex Nolasco
10
Tapi sedikit noobish, saya juga mencoba menggunakan // untuk komentar di JSON. Sekarang saya sadar bahwa ini digunakan untuk pertukaran / pertukaran. Mendesah! Saya tidak bisa berkomentar lagi :(. Hidup ini dikutuk !.
Semua JSON harus berupa data, dan jika Anda memasukkan komentar, maka itu juga akan menjadi data.
Anda bisa memiliki elemen data yang ditunjuk yang disebut "_comment"(atau sesuatu) yang akan diabaikan oleh aplikasi yang menggunakan data JSON.
Anda mungkin akan lebih baik memiliki komentar dalam proses yang menghasilkan / menerima JSON, karena mereka seharusnya tahu apa yang akan menjadi data JSON di muka, atau setidaknya struktur itu.
Tetapi jika Anda memutuskan untuk:
{"_comment":"comment text goes here...","glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}
Mungkin membayar untuk memiliki semacam awalan pada komentar aktual jika ada bidang yang valid bernama komentar:"__comment":"comment text goes here...",
Rob Fonseca-Ensor
19
BTW, perpustakaan json untuk Java google-gson memiliki dukungan untuk komentar.
centic
11
Bagaimana jika saya ingin komentar terpisah pada properti Accronymdan Abbrev? Saya telah menggunakan pola ini sebelumnya tetapi berhenti karena tidak memungkinkan saya untuk melakukan itu. Itu adalah hack. Mungkin jika saya menambahkan nama properti __comment__sebagai gantinya. Itu adalah "__comment__Abbrev", masih merupakan peretasan, tapi saya akan mengomentari semua prpoerties
Juan Mendes
41
Anda juga bisa menggunakan "//": ini terlihat lebih asli dan masih dapat diulang di induk yang sama
smnbbrv
4
Ketika JSON digunakan untuk file-file konfigurasi yang dimaksudkan manusia, mereka harus dijelaskan untuk dipahami oleh manusia. Beranotasi, file seperti itu tidak lagi valid JSON, tetapi ada solusi. Misalnya, Google GYP mendukung komentar # -style. JSON.Minify akan membantu Anda membuang komentar gaya C / C ++ dari file input Anda.
Петър Петров
1842
Tidak , komentar formulir //…atau /*…*/tidak diizinkan di JSON. Jawaban ini didasarkan pada:
Jika Anda ingin membubuhi keterangan pada JSON Anda dengan komentar (sehingga menjadikannya JSON tidak valid), minimalkan sebelum parsing atau transmisi. Crockford sendiri mengakui hal ini pada tahun 2012 dalam konteks file konfigurasi.
toolbear
25
@alkuzad: Ketika datang ke tata bahasa formal, harus ada sesuatu yang secara eksplisit mengatakan bahwa mereka yang diperbolehkan, tidak sebaliknya. Sebagai contoh, pilih bahasa pemrograman pilihan Anda: Hanya karena beberapa fitur yang diinginkan (tetapi tidak ada) tidak dianulir secara eksplisit, tidak berarti bahwa kompiler Anda akan mengenalinya secara ajaib.
stakx - tidak lagi berkontribusi
5
Iya. Format JSON memiliki banyak ruang mati di antara elemen dan tidak peka ruang di wilayah tersebut, jadi tidak ada alasan mengapa Anda tidak dapat memiliki komentar tunggal atau multi-baris di sana. Banyak parser dan minifiers mendukung komentar JSON juga, jadi pastikan parser Anda mendukungnya. JSON banyak digunakan untuk data aplikasi dan pengaturan konfigurasi, jadi komentar diperlukan sekarang. "Spesifikasi resmi" adalah ide yang bagus, tetapi tidak memadai dan usang, terlalu buruk. Perkecil JSON Anda jika Anda khawatir tentang ukuran muatan atau kinerja.
Triynko
58
Meskipun jawaban Anda sepenuhnya benar, harus dikatakan bahwa ini adalah BS. Dengan begitu banyak pengguna akhir menemukan perlunya konfigurasi json, maka komentar sangat membantu. Hanya karena beberapa topi timah memutuskan bahwa JSON adalah dan harus selalu dapat dibaca dengan mesin, mengabaikan fakta bahwa manusia perlu membacanya, adalah semacam parodi dari pikiran kecil.
cmroanirgo
18
@cmroanirgo: Anda jelas bukan yang pertama mengeluh tentang pembatasan JSON ... itu sebabnya kami memiliki parser yang diam-diam mengizinkan komentar, dan format lain seperti YAML dan JSON5. Namun ini tidak mengubah fakta bahwa JSON adalah apa adanya. Sebaliknya, saya merasa menarik bahwa orang-orang mulai menggunakan JSON untuk tujuan yang jelas tidak mencukupi, mengingat keterbatasan yang dipermasalahkan. Jangan salahkan format JSON; menyalahkan diri sendiri karena bersikeras menggunakannya di tempat yang tidak cocok.
stakx - tidak lagi berkontribusi
802
Sertakan komentar jika Anda memilih; strip mereka dengan minifier sebelum parsing atau mentransmisikan.
Saya baru saja merilis JSON.minify () yang menghapus komentar dan spasi putih dari blok JSON dan menjadikannya JSON yang valid yang dapat diuraikan. Jadi, Anda dapat menggunakannya seperti:
JSON.parse(JSON.minify(my_str));
Ketika saya merilisnya, saya mendapat reaksi besar dari orang-orang yang tidak setuju bahkan dengan gagasan itu, jadi saya memutuskan bahwa saya akan menulis posting blog yang komprehensif tentang mengapa komentar masuk akal di JSON . Ini termasuk komentar penting dari pencipta JSON:
Misalkan Anda menggunakan JSON untuk menyimpan file konfigurasi, yang ingin Anda anotasi. Silakan masukkan semua komentar yang Anda suka. Kemudian pipa melalui JSMin sebelum menyerahkannya ke parser JSON Anda. - Douglas Crockford, 2012
Semoga bermanfaat bagi mereka yang tidak setuju mengapa JSON.minify () dapat bermanfaat.
Satu-satunya masalah yang saya miliki dengan JSON.minify () adalah sangat lambat. Jadi saya membuat implementasi saya sendiri yang melakukan hal yang sama: gist.github.com/1170297 . Pada beberapa file uji besar implementasi Anda membutuhkan 74 detik dan menambang 0,06 detik.
WizKid
56
alangkah baiknya jika Anda bisa mengirimkan algoritme alternatif yang disarankan ke repo github untuk JSON.minify (), sehingga dapat diporting ke semua versi yang didukung: github.com/getify/json.minify
Kyle Simpson
16
@ MinGod Saya sudah sering mendengar pemikiran Doug tentang topik ini. Saya berbicara dengan mereka sejak lama di posting blog saya: blog.getify.com/json-comments
Kyle Simpson
18
@ MarnenLaibow-Koser masih ada kegunaan yang valid untuk komentar bahkan untuk penggunaan aliran data (atau bahkan paket): dimasukkannya metadata diagnostik seperti waktu pembuatan atau sumber adalah penggunaan umum dengan XML, dan sangat masuk akal untuk data JSON juga. Argumen terhadap komentar adalah dangkal, dan format data tekstual apa pun harus memungkinkan untuk komentar, terlepas dari penggunaan yang tersirat (tidak ada spec menyarankan JSON tidak dapat digunakan di tempat lain, fwiw)
StaxMan
18
Jika JSON ingin memiliki penerimaan universal (yang pada dasarnya memang demikian) maka ia harus memiliki aplikasi universal. Contoh: JSON dapat berfungsi sebagai file konfigurasi aplikasi. Aplikasi ini menginginkan komentar.
Eggmatters
441
Komentar dihapus dari JSON oleh desain.
Saya menghapus komentar dari JSON karena saya melihat orang menggunakannya untuk memegang arahan parsing, sebuah praktik yang akan menghancurkan interoperabilitas. Saya tahu bahwa kurangnya komentar membuat beberapa orang sedih, tetapi seharusnya tidak.
Misalkan Anda menggunakan JSON untuk menyimpan file konfigurasi, yang ingin Anda anotasi. Silakan masukkan semua komentar yang Anda suka. Kemudian pipa melalui JSMin sebelum menyerahkannya ke parser JSON Anda.
Saya pikir JSON seharusnya lebih bisa dibaca manusia daripada, katakanlah, XML? Komentar untuk keterbacaan.
intrepidis
25
Pokoknya, Anda bisa nakal dan menambahkan arahan parsing di JSON: {"__directives": {"# n #": "DateTime.Now"}, "validdate": "# n #"} ... Sepertinya YAML adalah jalan ke depan kalau begitu ...
intrepidis
73
Pendapat pribadi: tidak mengizinkan komentar timpang. Saya tidak punya pilihan selain membangun parser JSON non-standar yang mengabaikan komentar, untuk memecahkan kode file konfigurasi saya.
caiosm1005
17
@ArturCzajka Saya masih tidak suka fakta JSON tidak mendukung komentar, tapi saya mencoba INI dan saya harus mengakui bahwa jauh lebih masuk akal untuk menggunakannya di JSON untuk file konfigurasi. Terima kasih atas tanggapannya dan semoga lebih banyak orang akan berubah pikiran ketika mereka membaca percakapan ini. (membuat parser lebih merupakan latihan :)
caiosm1005
77
Itu seperti mengharuskan semua sepeda untuk memiliki roda pelatihan karena beberapa orang tidak bisa mengendarai sepeda. Menghapus fitur penting karena orang bodoh menyalahgunakannya adalah desain yang buruk. Format data harus memprioritaskan kegunaan daripada menjadi idiot-proof.
Phil Goetz
205
PENOLAKAN: GARANSI ANDA TIDAK BISA
Seperti yang telah ditunjukkan, peretasan ini mengambil keuntungan dari implementasi spesifikasi. Tidak semua parser JSON akan memahami JSON semacam ini. Pengurai aliran secara khusus akan tersedak.
Ini merupakan keingintahuan yang menarik, tetapi Anda seharusnya tidak menggunakannya untuk apa pun . Di bawah ini adalah jawaban asli.
Saya telah menemukan hack kecil yang memungkinkan Anda untuk menempatkan komentar di file JSON yang tidak akan memengaruhi parsing, atau mengubah data yang diwakili dengan cara apa pun.
Tampaknya ketika mendeklarasikan objek literal Anda dapat menentukan dua nilai dengan kunci yang sama, dan yang terakhir diutamakan. Percaya atau tidak, ternyata parser JSON bekerja dengan cara yang sama. Jadi kita dapat menggunakan ini untuk membuat komentar di JSON sumber yang tidak akan hadir dalam representasi objek yang diuraikan.
Jika kami menerapkan teknik ini, file JSON Anda yang dikomentari mungkin terlihat seperti ini:
{"api_host":"The hostname of your API server. You may also specify the port.","api_host":"hodorhodor.com","retry_interval":"The interval in seconds between retrying failed API calls","retry_interval":10,"auth_token":"The authentication token. It is available in your developer dashboard under 'Settings'","auth_token":"5ad0eb93697215bc0d48a7b69aa6fb8b","favorite_numbers":"An array containing my all-time favorite numbers","favorite_numbers":[19,13,53]}
Kode di atas adalah JSON yang valid . Jika Anda menguraikannya, Anda akan mendapatkan objek seperti ini:
TIDAK - bagaimana jika parser mengalir? Bagaimana jika parser membacanya ke dalam kamus di mana pemesanan kunci tidak ditentukan? bunuh ini dengan api .
deanWombourne
183
JSON tidak mendukung komentar. Itu juga tidak pernah dimaksudkan untuk digunakan untuk file konfigurasi di mana komentar akan diperlukan.
Hjson adalah format file konfigurasi untuk manusia. Sintaks santai, lebih sedikit kesalahan, lebih banyak komentar.
Lihat hjson.org untuk perpustakaan JavaScript, Java, Python, PHP, Rust, Go, Ruby dan C #.
Terpilih. Jelas itu adalah variasi yang baik, orang-orang konservatif yang tidak terbuka akan suka membenci. Saya harap implementasi Anda diketahui lebih lanjut - dan bahkan mungkin menjadi lebih populer daripada yang asli;) Saya harap seseorang dapat mengimplementasikannya dengan Ruby juga. @adelphus Bahasa yang didefinisikan dengan baik adalah perspektif atau pendapat Anda sendiri. Menjadi "pengembang" yang konservatif jika Anda salah satunya tidak membuktikan bahwa Anda lebih baik dan Anda bisa lebih buruk lagi menjaga diri Anda terkunci di ruang terbatas. Jangan menilai orang sebagai pengembang yang buruk dengan mudah.
konsolebox
7
Maaf soal itu, @konsolebox. Mungkin Anda dapat mempertimbangkan kembali pandangan "JSON yang didefinisikan dengan baik adalah pendapat Anda" setelah membaca ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf Ini adalah standar nyata dan pengembang yang mengimplementasikan versi "khusus" mereka sendiri menyebabkan fragmentasi, kebingungan dan banyak waktu terbuang. Lihat kekacauan yang ditinggalkan pengembang web saat menulis kode hanya karena setiap browser menerapkan versi standar yang sedikit berbeda. Bahasa JSON mungkin tidak sempurna, tetapi fragmentasi lebih buruk. Dan ya, itu hanya pendapat dan Anda bebas untuk tidak setuju.
adelphus
22
Saya mengagumi keberanian Anda, tetapi Anda agak menciptakan kembali YAML. Jika Anda ingin banyak fleksibilitas dan keterbacaan manusia, gunakan YAML (tidak benar-benar: stackoverflow.com/questions/450399/… ) atau tetap menggunakan curmudgeony, namun JSON tidak ambigu.
toolbear
4
Saya menemukan format konfigurasi yang paling user-friendly masih INI. Sangat mudah dan tidak terlalu sintaks. Ini membuatnya kurang menakutkan bagi pengguna hanya mencelupkan jari kaki mereka di kolam konfigurasi.
Matt
14
Kapanpun Anda membutuhkan json sebagai config (di mana komentar yang diperlukan) - nama file Anda "js" bukan ".json" .. js tentu saja dapat menangani objek json valid dan juga dapat menangani comments .. Itulah alasan mengapa "webpack.config.js" dan bukan "webpack.config.json" (well, ada lebih banyak alasan untuk itu juga di webpack: P)
jebbie
122
Pertimbangkan untuk menggunakan YAML. Ini hampir superset dari JSON (hampir semua JSON yang valid adalah YAML yang valid) dan memungkinkan komentar.
@ g33kz0r Benar, maka deskripsi saya tentang YAML sebagai superset dekat JSON.
Marnen Laibow-Koser
12
@NateS Banyak orang sudah mengatakan bahwa jawabannya adalah tidak. Saya menyarankan cara yang lebih baik untuk mencapai tujuan OP. Itu jawaban.
Marnen Laibow-Koser
5
Kelemahan: yamlpustaka tidak dikirimkan dengan Python.
Bleeding Fingers
6
@ marnen-laibow-koser: yup, pasti tidak kompeten untuk menggunakan pustaka YAML yang tersedia untuk Java dan Perl dan mengharapkan YAML yang diproduksi oleh masing-masing akan dikonsumsi oleh yang lain tanpa kesalahan. Bahwa YAML interop adalah masalah, tetapi JSON interop tidak, sepenuhnya dijelaskan oleh kurangnya pengetahuan saya.
toolbear
3
@ marnen-laibow-koser, format yang menyelesaikan hal yang sama dengan spek yang lebih sederhana lebih baik. Format pragmatis dengan implementasi sempurna lebih baik daripada format ideal dengan implementasi tidak sempurna. Tidak semua kesalahan atas lib yang salah terletak di pundak para pelaksana; spec YAML panjang, padat, dan tumpul. Entri Wikipedianya mengutip dua contoh ambiguitas; jika seseorang harus meletakkan emitor antara manusia dan format untuk melindungi mereka dari ambiguitas, format kehilangan klaim ramah manusiawinya. JSON mengklaim lebih sedikit dan sebagian besar berhasil di mana YAML mengklaim lebih banyak dan gagal.
toolbear
108
Kamu tidak bisa Setidaknya itulah pengalaman saya dari pandangan sekilas di json.org .
JSON memiliki sintaksis yang divisualisasikan pada halaman itu. Tidak ada catatan tentang komentar.
Komentar bukanlah standar resmi, meskipun beberapa parser mendukung komentar gaya C ++. Salah satu yang saya gunakan adalah JsonCpp . Dalam contohnya ada yang ini:
// Configuration options{// Default encoding for text"encoding":"UTF-8",// Plug-ins loaded at start-up"plug-ins":["python","c++","ruby"],// Tab indent size"indent":{"length":3,"use_space":true}}
jsonlint tidak memvalidasi ini. Jadi komentar adalah ekstensi spesifik parser dan bukan standar.
Groovy memiliki beberapa kelas bawaan untuk menangani JSON . JsonSlurper dapat menangani komentar. Tentu saja, komentar tidak diperbolehkan dalam spesifikasi resmi, jadi perilaku ini di parser apa pun adalah non-standar dan non-portabel.
izrik
Newtonsoft Json.NET juga mendukung komentar gaya-C tanpa masalah
Max
66
Anda harus menulis skema JSON sebagai gantinya. Skema JSON saat ini merupakan spesifikasi rancangan Internet yang diusulkan. Selain dokumentasi, skema ini juga dapat digunakan untuk memvalidasi data JSON Anda.
Inilah yang saya temukan dalam dokumentasi Google Firebase yang memungkinkan Anda untuk memberikan komentar di JSON:
{"//":"Some browsers will use this to enable push notifications.","//":"It is the same for all projects, this is not your project's sender ID","gcm_sender_id":"1234567890"}
FYI, Firebase Realtime Database tidak mengizinkan penggunaan '/' pada kunci. jadi ini bisa menjadi konvensi yang bagus untuk penggunaan Anda sendiri, tetapi Anda tidak bisa melakukannya di Firebase
gutte
5
Metode ini memecah beberapa perpustakaan, yang mengharuskan kunci harus unik. Saya mengatasi masalah itu dengan memberi nomor komentar.
Saya cenderung menggunakannya seperti ini saat ini: {"// foo": "foo comment", "foo": "foo value", "// bar": "bar comment", "bar": "bar value"} Anda dapat menggunakan larik untuk banyak komentar: {"// foo": ["foo comment 1", "foo comment 2"], "foo": '' foo value "}
MovGP0
47
TIDAK . JSON digunakan untuk mendukung komentar, tetapi mereka dilecehkan dan dihapus dari standar.
Dari pencipta JSON:
Saya menghapus komentar dari JSON karena saya melihat orang menggunakannya untuk memegang arahan parsing, sebuah praktik yang akan menghancurkan interoperabilitas. Saya tahu bahwa kurangnya komentar membuat beberapa orang sedih, tetapi seharusnya tidak. - Douglas Crockford, 2012
Situs resmi JSON ada di JSON.org . JSON didefinisikan sebagai standar oleh ECMA International. Selalu ada proses petisi untuk merevisi standar. Kecil kemungkinan bahwa anotasi akan ditambahkan ke standar JSON karena beberapa alasan.
JSON by design adalah alternatif XML yang mudah direkayasa ulang (diurai manusia). Ini disederhanakan bahkan ke titik bahwa penjelasan tidak perlu. Itu bahkan bukan bahasa markup. Tujuannya adalah stabilitas dan interoperablilty.
Siapa pun yang memahami hubungan orientasi objek "has-a" dapat memahami setiap struktur JSON - itulah intinya. Ini hanya grafik asiklik terarah (DAG) dengan tag node (pasangan kunci / nilai), yang merupakan struktur data hampir universal.
Anotasi ini hanya diperlukan mungkin "// Ini adalah tag DAG". Nama-nama kunci dapat informatif seperti yang diperlukan, memungkinkan arity semantik sewenang-wenang.
Platform apa pun dapat mengurai JSON hanya dengan beberapa baris kode. XML membutuhkan pustaka OO kompleks yang tidak dapat dijalankan pada banyak platform.
Penjelasan hanya akan membuat JSON membuat lebih sedikit interoperable. Tidak ada hal lain untuk ditambahkan, kecuali apa yang benar-benar Anda butuhkan adalah bahasa markup (XML), dan tidak peduli jika data Anda yang bertahan mudah diurai.
TETAPI seperti yang diamati oleh pembuat JSON, selalu ada dukungan pipeline JS untuk komentar:
Silakan masukkan semua komentar yang Anda suka. Kemudian pipa melalui JSMin sebelum menyerahkannya ke parser JSON Anda. - Douglas Crockford, 2012
Jika file teks Anda, yang merupakan string JSON, akan dibaca oleh beberapa program, seberapa sulitkah untuk menghapus komentar gaya C atau C ++ sebelum menggunakannya?
Jawaban: Itu akan menjadi satu liner. Jika Anda melakukannya, file JSON dapat digunakan sebagai file konfigurasi.
Mungkin saran terbaik sejauh ini, meskipun masih menjadi masalah untuk menyimpan file sebagai format interchange, karena mereka perlu pra-pemrosesan sebelum digunakan.
Orbling
Saya setuju dan telah menulis parser JSON di Jawa, tersedia di www.SoftwareMonkey.org, yang melakukan hal itu.
Lawrence Dol
2
Meskipun saya pikir, itu bukan ide yang baik untuk memperpanjang JSON (tanpa menyebutnya format pertukaran yang berbeda): pastikan untuk mengabaikan "komentar" dalam string. {"foo": "/ * Ini bukan komentar. * /"}
stofl
27
"... akan menjadi satu garis" umm, tidak, sebenarnya, JSON bukan tata bahasa biasa di mana ekspresi reguler hanya dapat menemukan pasangan yang cocok dari / *. Anda harus mengurai file untuk menemukan apakah / * muncul di dalam string (dan abaikan), atau jika lolos (dan abaikan), dll. Selain itu, jawaban Anda tidak membantu karena Anda hanya berspekulasi (salah) daripada memberikan solusi apa pun.
Kyle Simpson
1
Apa yang dikatakan @ kyle-simpson. Selain itu, ia terlalu sederhana untuk mengarahkan pembaca ke jawabannya sendiri tentang menggunakan JSON. Minify sebagai alternatif untuk regexps ad hoc. Lakukan itu, bukan ini.
toolbear
36
Jika Anda menggunakan pustaka Newtonsoft.Json dengan ASP.NET untuk membaca / deserialize Anda dapat menggunakan komentar dalam konten JSON:
// "nama": "string"
// "id": int
atau
/* Ini adalah sebuah
contoh komentar * /
PS: Komentar single-line hanya didukung dengan 6+ versi Newtonsoft Json.
Catatan tambahan untuk orang-orang yang tidak bisa berpikir di luar kotak: Saya menggunakan format JSON untuk pengaturan dasar dalam aplikasi web ASP.NET yang saya buat. Saya membaca file, mengubahnya menjadi objek pengaturan dengan pustaka Newtonsoft dan menggunakannya saat diperlukan.
Saya lebih suka menulis komentar tentang masing-masing pengaturan individu dalam file JSON itu sendiri, dan saya benar-benar tidak peduli tentang integritas format JSON selama perpustakaan yang saya gunakan tidak masalah.
Saya pikir ini adalah cara yang 'lebih mudah digunakan / dipahami' daripada membuat file 'settings.README' yang terpisah dan menjelaskan pengaturan di dalamnya.
Jika Anda memiliki masalah dengan penggunaan seperti ini; maaf, jin sudah keluar dari lampu. Orang akan menemukan penggunaan lain untuk format JSON, dan tidak ada yang dapat Anda lakukan untuk itu.
Sulit untuk memahami mengapa seseorang memiliki masalah dengan menyatakan fakta.
dvdmn
Saya akan menganggap seseorang mengambil pengecualian karena di atas tidak lagi JSON, atau JSON tidak valid. Mungkin menambahkan penafian singkat akan menenangkan.
toolbear
5
Saya sepenuhnya setuju dengan Anda, namun sejauh ini ada 883 upvotes untuk jawaban yang hanya menyatakan yang sudah jelas. Kemurnian ideologis dihargai di atas informasi bermanfaat, itu SANGAT untuk Anda.
John
Intinya adalah file dengan komentar bukan JSON dan akan gagal diuraikan oleh banyak perpustakaan JSON. Jangan ragu untuk melakukan apa pun yang Anda inginkan dalam program Anda sendiri tetapi file dengan komentar bukanlah JSON. Jika Anda mengklaim itu maka orang akan mencoba menguraikannya dengan bahasa / perpustakaan pilihan mereka dan itu akan gagal. Ini seperti menanyakan apakah Anda dapat menggunakan tanda kurung siku alih-alih tanda kurung dalam XML. Anda dapat melakukan apa pun yang Anda inginkan tetapi tidak lagi berupa XML.
GM
32
Gagasan di balik JSON adalah untuk menyediakan pertukaran data sederhana antar aplikasi. Ini biasanya berbasis web dan bahasanya adalah JavaScript.
Itu tidak benar-benar memungkinkan untuk komentar seperti itu, namun, memberikan komentar sebagai salah satu pasangan nama / nilai dalam data pasti akan berfungsi, meskipun data itu jelas perlu diabaikan atau ditangani secara khusus oleh kode parsing.
Semua yang dikatakan, itu bukan maksud bahwa file JSON harus mengandung komentar dalam arti tradisional. Seharusnya hanya data.
Memang benar bahwa format JSON tidak memiliki komentar. Secara pribadi saya pikir itu adalah kesalahan yang signifikan - kemampuan untuk memiliki komentar sebagai metadata (bukan data) adalah hal yang sangat berguna dengan xml. Versi draf spesifikasi JSON sebelumnya memang menyertakan komentar, tetapi untuk beberapa alasan mereka dibatalkan. : - /
StaxMan
4
@StaxMan mereka dijatuhkan tepat karena orang-orang mulai menggunakannya sebagai metadata. Crockford mengatakan itu melanggar kompatibilitas untuk format apa yang dirancang, dan saya setuju: jika Anda ingin metadata, mengapa tidak memasukkannya sebagai data aktual? Lebih mudah mengurai cara ini.
Camilo Martin
6
Metadata termasuk dalam konstruksi metadata (mis. Tag HTML <meta>), bukan komentar. Komentar yang menyalahgunakan untuk metadata hanyalah peretasan yang digunakan di mana tidak ada konstruksi metadata yang sebenarnya.
Marnen Laibow-Koser
Itulah alasan mengapa itu dijatuhkan: komentar yang digunakan sebagai metadata akan memutus interoperabilitas. Anda juga harus menyimpan meta-data Anda sebagai JSON.
Gaborous
1
Jawaban ini berlebihan dengan jawaban yang ditulis lebih baik, lebih tinggi, yang pada dasarnya mengatakan hal yang sama, meskipun ini mungkin telah ditulis sebelumnya. Cest la vie.
toolbear
29
Saya hanya menemukan ini untuk file konfigurasi. Saya tidak ingin menggunakan XML (verbose, grafis, jelek, sulit dibaca), atau "ini" (tidak ada hierarki, tidak ada standar nyata, dll.) Atau format Java "Properties" (seperti .ini).
JSON dapat melakukan semua yang dapat mereka lakukan, tetapi cara ini lebih tidak jelas dan lebih dapat dibaca manusia - dan parser mudah dan ada di mana-mana dalam banyak bahasa. Itu hanya sebatang data. Tetapi komentar out-of-band sering diperlukan untuk mendokumentasikan konfigurasi "default" dan sejenisnya. Konfigurasi tidak pernah menjadi "dokumen lengkap", tetapi pohon data yang disimpan yang dapat dibaca manusia saat dibutuhkan.
Saya kira orang bisa menggunakan "#": "comment", untuk JSON "valid".
Untuk file konfigurasi, saya sarankan YAML, bukan JSON. Ini (hampir) superset yang lebih kuat dari JSON, tetapi mendukung konstruksi yang lebih mudah dibaca juga, termasuk komentar.
Marnen Laibow-Koser
1
menurut Anda berapa banyak bahasa yang mendukung YAML di luar kotak dibandingkan dengan json?
mmm
@ Hamidam Lebih dari selusin bahasa mendukung yaml: yaml.org - tetapi Anda berhak bertanya berapa banyak yang memiliki dukungan built-in, tanpa perlu ketergantungan perpustakaan pihak ketiga. Sepertinya Ruby 1.9.2 tidak. Adakah yang tahu tentang yang lain? Dan bahasa mana yang memberikan dukungan untuk json secara default?
Ini sudah tua, tetapi saya percaya bahwa menggunakan # bukanlah ide yang baik. Json dekat dengan sintaks litteral Javascript. Javascript mendukung 2 jenis komentar: // dan / * ... * / Jika saya adalah Anda, saya akan tetap dengan satu atau kedua jenis komentar ini.
Pascal Ganaye
28
JSON tidak mendukung komentar secara native, tetapi Anda dapat membuat dekoder sendiri atau setidaknya preprocessor untuk menghapus komentar, itu baik-baik saja (selama Anda mengabaikan komentar dan tidak menggunakannya untuk memandu bagaimana aplikasi Anda harus memproses data JSON ).
JSON tidak memiliki komentar. Encoder JSON TIDAK HARUS menampilkan komentar. Dekoder JSON DAPAT menerima dan mengabaikan komentar.
Komentar tidak boleh digunakan untuk mengirimkan sesuatu yang bermakna. Untuk itulah JSON diperuntukkan.
Crockford kemudian melanjutkan untuk menulis: "Misalkan Anda menggunakan JSON untuk menyimpan file konfigurasi, yang ingin Anda beri catatan. Silakan masukkan semua komentar yang Anda suka. Kemudian kirimkan melalui JSMin sebelum menyerahkannya ke parser JSON Anda." Lihat jawaban @ kyle-simpson tentang JSON.minify untuk info lebih lanjut.
toolbear
28
Itu tergantung pada perpustakaan JSON Anda. Json.NET mendukung komentar gaya JavaScript,/* commment */ ,.
Dan saya percaya itulah sebabnya saya melihat komentar dalam tangkapan layar di halaman pratinjau ASP.NET vNext ini (di bawah package.json): blogs.msdn.com/b/webdev/archive/2014/06/03/… meskipun saya belum belum menemukan apa pun di spec.
webXL
27
JSON sangat masuk akal untuk file konfigurasi dan penggunaan lokal lainnya karena ini ada di mana-mana dan karena itu jauh lebih sederhana daripada XML.
Jika orang memiliki alasan kuat untuk tidak memiliki komentar di JSON saat berkomunikasi data (apakah valid atau tidak), maka kemungkinan JSON dapat dibagi menjadi dua:
JSON-COM: JSON on the wire, atau aturan yang berlaku saat mengkomunikasikan data JSON.
JSON-DOC: dokumen JSON, atau JSON dalam file atau secara lokal. Aturan yang menentukan dokumen JSON yang valid.
JSON-DOC akan memungkinkan komentar, dan perbedaan kecil lainnya mungkin ada seperti menangani spasi. Parser dapat dengan mudah mengkonversi dari satu spec ke yang lainnya.
Berkenaan dengan komentar yang dibuat oleh Douglas Crockford tentang masalah ini (dirujuk oleh @Artur Czajka)
Misalkan Anda menggunakan JSON untuk menyimpan file konfigurasi, yang ingin Anda anotasi. Silakan masukkan semua komentar yang Anda suka. Kemudian pipa melalui JSMin sebelum menyerahkannya ke parser JSON Anda.
Kita berbicara tentang masalah file konfigurasi umum (lintas bahasa / platform), dan dia menjawab dengan utilitas khusus JS!
Tentu saja minify khusus JSON dapat diimplementasikan dalam bahasa apa pun, tetapi distandarisasi ini sehingga menjadi di mana-mana di parser dalam semua bahasa dan platform sehingga orang berhenti membuang-buang waktu mereka kekurangan fitur karena mereka memiliki kasus penggunaan yang baik untuk itu, mencari masalah di forum online, dan membuat orang memberi tahu mereka bahwa itu adalah ide yang buruk atau menyarankan itu mudah untuk menerapkan pengupasan komentar dari file teks.
Masalah lainnya adalah interoperabilitas. Misalkan Anda memiliki perpustakaan atau API atau jenis subsistem apa pun yang memiliki beberapa file konfigurasi atau data yang terkait dengannya. Dan subsistem ini harus diakses dari berbagai bahasa. Lalu, apakah Anda memberi tahu orang-orang: omong-omong jangan lupa menghapus komentar dari file JSON sebelum meneruskannya ke parser!
Tidak perlu memecah JSON. JSON dengan komentar bukan JSON lagi. Tapi sangat bisa diterima untuk membubuhi keterangan pada JSON Anda dengan komentar, selama Anda memastikan untuk menghapusnya sebelum menguraikan atau mentransmisikannya. Seharusnya tidak pernah menjadi tanggung jawab penerima untuk melakukan ini.
Jika Anda menggunakan JSON5 Anda dapat memasukkan komentar.
JSON5 adalah ekstensi yang diusulkan ke JSON yang bertujuan untuk memudahkan manusia menulis dan memelihara dengan tangan. Ini dilakukan dengan menambahkan beberapa fitur sintaks minimal langsung dari ECMAScript 5.
Bisakah Anda menambahkan contoh? Maka Anda mungkin benar-benar membutuhkan karakter tambahan itu.
dgilperez
6
Diperlukan oleh pedoman SO untuk memberikan jawaban yang sebenarnya. Jawaban khusus tautan tidak diinginkan. Anda dapat memeriksa pedoman stackoverflow.com/help/how-to-answer
dgilperez
2
SO dimoderasi oleh penggunanya. Itu berarti saya dapat memberikan jawaban jika saya memiliki cara yang sama dengan saya dapat memberikan komentar Anda jika tidak mengikuti pedoman. Begitulah cara SO menjadi sumber daya yang hebat.
dgilperez
22
Toolkit JavaScript Dojo Toolkit (setidaknya pada versi 1.4), memungkinkan Anda untuk memasukkan komentar dalam JSON Anda. Komentar dapat dalam /* */format. Dojo Toolkit mengkonsumsi JSON melalui dojo.xhrGet()panggilan.
Toolkit JavaScript lainnya dapat bekerja dengan cara yang sama.
Ini dapat membantu ketika bereksperimen dengan struktur data alternatif (atau bahkan daftar data) sebelum memilih opsi final.
Bukan ini. JSON tidak memiliki komentar. Jika Anda memilih untuk membubuhi keterangan pada JSON Anda dengan komentar, minify itu sebelum menguraikan atau mentransmisikan. Ini seharusnya bukan tanggung jawab penerima.
toolbear
2
Saya tidak mengatakan bahwa JSON memiliki komentar. Saya juga tidak bermaksud mengatakan bahwa pantas memasukkan mereka ke dalam JSON Anda, terutama dalam sistem produksi. Saya mengatakan bahwa toolkit Dojo memungkinkan Anda untuk menambahkannya, yang (atau setidaknya,) secara faktual benar. Ada kasus penggunaan yang sangat membantu di luar sana untuk melakukannya dalam fase pengujian Anda.
David
1
Ini adalah voodoo buruk untuk melayani berkomentar, dan karenanya JSON tidak valid, yang dojo.xhrGet()secara implisit mendorong dengan menerima.
toolbear
Saya masih memilih untuk meningkatkan spesifikasi JSON untuk memungkinkan komentar. Saya semua untuk meminimalkan dan menghapus komentar sebelum mengirimkan JSON, tetapi tidak memiliki kemampuan untuk mengomentari JSON Anda dengan cara standar apa pun tanpa harus melewati itu melalui utilitas terpisah sebelum menguraikannya tampak konyol. Saya juga membuatnya tidak mungkin menggunakan editor JSON pada file konfigurasi JSON Anda, karena file Anda bukan JSON yang valid.
Craig
20
JSON bukan protokol berbingkai . Ini adalah format bebas bahasa . Jadi format komentar tidak ditentukan untuk JSON.
Seperti yang disarankan banyak orang, ada beberapa trik, misalnya, kunci duplikat atau kunci tertentu _commentyang dapat Anda gunakan. Terserah kamu.
?(/* AAPL historical OHLC data from the Google Finance API */[/* May 2006 */[1147651200000,67.79],[1147737600000,64.98],...[1368057600000,456.77],[1368144000000,452.97]]);
Karena saya memiliki file serupa di folder lokal saya, tidak ada masalah dengan kebijakan asal-sama , jadi saya memutuskan untuk menggunakan JSON murni ... dan, tentu saja,$.getJSON gagal diam-diam karena komentar.
Akhirnya saya baru saja mengirim permintaan HTTP manual ke alamat di atas dan menyadari bahwa tipe konten text/javascriptsejak itu , yah, JSONP mengembalikan JavaScript murni. Dalam hal ini komentar diperbolehkan . Tetapi aplikasi saya mengembalikan tipe konten application/json, jadi saya harus menghapus komentar.
Ini adalah pertanyaan "bisakah kamu" . Dan inilah jawaban "ya" .
Tidak, Anda tidak boleh menggunakan anggota objek duplikat untuk memasukkan data saluran sisi ke dalam pengkodean JSON. (Lihat "Nama-nama dalam suatu objek HARUS unik" di RFC ).
Tetapi jika Anda ingin cara memasukkan dan mengekstrak data saluran samping sewenang-wenang ke JSON yang valid, berikut ini jawabannya. Kami mengambil keuntungan dari representasi data yang tidak unik dalam penyandian JSON. Ini diperbolehkan * di bagian dua RFC di bawah "spasi putih diizinkan sebelum atau setelah salah satu dari enam karakter struktural".
* RFC hanya menyatakan "spasi putih diizinkan sebelum atau sesudah salah satu dari enam karakter struktural", tidak secara eksplisit menyebutkan string, angka, "false", "true", dan "null". Kelalaian ini diabaikan dalam SEMUA implementasi.
Pertama, dikanonisasi JSON Anda dengan mengecilkannya:
RFC hanya menyatakan "spasi putih diperbolehkan sebelum atau sesudah salah satu dari keenam karakter struktural", tidak secara eksplisit menyebutkan string, angka, "false", "true", "null". Kelalaian ini diabaikan dalam SEMUA implementasi.
William Entriken
1
Untuk kerapatan komentar yang lebih besar, tidak bisakah Anda menyandikan komentar Anda di ternary dan menggunakan spasi, tab, dan baris baru untuk menghentikannya?
Claire Nielsen
HARUS tidak. Lihat RFC 2119 yang secara eksplisit disertakan: HARUS: Kata ini, atau istilah "DIPERLUKAN" atau "AKAN", berarti bahwa definisi tersebut merupakan persyaratan mutlak dari spesifikasi. ... HARUS: Kata ini, atau kata sifat "DIREKOMENDASIKAN", berarti bahwa mungkin ada alasan yang valid dalam keadaan tertentu untuk mengabaikan item tertentu, tetapi implikasi penuh harus dipahami dan ditimbang dengan hati-hati sebelum memilih kursus yang berbeda.
Jeff K
Referensi yang bagus. Alasan yang lebih baik untuk tidak menggunakan kunci duplikat adalah kutipan standar "Ketika nama-nama dalam suatu objek tidak unik, perilaku perangkat lunak yang menerima objek seperti itu tidak dapat diprediksi.". Juga sekarang saya mengerti mengapa standar itu tidak "HARUS unik," ini membuat validator lebih sederhana, hanya perlu melacak [dan {, tidak perlu tahu kunci mana yang sudah digunakan.
William Entriken
16
DISCLAIMER: INI SILLY
Sebenarnya ada cara untuk menambahkan komentar, dan tetap dalam spesifikasi (tidak perlu parser tambahan). Itu tidak akan menghasilkan komentar yang dapat dibaca manusia tanpa semacam parsing sekalipun.
Anda dapat menyalahgunakan yang berikut ini:
Ruang kosong yang tidak signifikan diizinkan sebelum atau setelah token apa pun. Whitespace adalah urutan dari satu atau lebih poin kode berikut: tabulasi karakter (U + 0009), umpan baris (U + 000A), carriage return (U + 000D), dan spasi (U + 0020).
Dengan cara meretas, Anda dapat menyalahgunakan ini untuk menambahkan komentar. Misalnya: mulai dan akhiri komentar Anda dengan sebuah tab. Encode komentar di base3 dan gunakan karakter spasi putih lain untuk mewakili mereka. Contohnya.
( hello base threedalam ASCII) Tetapi alih-alih menggunakan 0 ruang, untuk 1 menggunakan umpan baris dan untuk 2 menggunakan carriage return.
Ini hanya akan meninggalkan Anda dengan banyak ruang kosong yang tidak dapat dibaca (kecuali jika Anda membuat plugin IDE untuk menyandikan / mendekodekannya dengan cepat).
Saya bahkan tidak pernah mencoba ini, untuk alasan yang jelas dan Anda juga tidak.
Perhatikan bahwa jsonini bukan JSON yang valid lagi saat menyertakan komentar kesopanan ini.
Roy Prins
12
Dalam kasus saya, saya perlu menggunakan komentar untuk keperluan debug, sebelum output dari struktur JSON. Jadi saya memutuskan untuk menggunakan informasi debug di header HTTP, untuk menghindari pemecahan klien:
header("My-Json-Comment: Yes, I know it's a workaround ;-) ");
JSON tidak mengizinkan komentar. Penalarannya benar-benar bodoh, karena Anda dapat menggunakan JSON sendiri untuk membuat komentar, yang sepenuhnya meniadakan penalaran, dan memuat ruang data parser tanpa alasan yang baik sama sekali untuk hasil dan potensi masalah yang persis sama, seperti: JSON file dengan komentar.
Jika Anda mencoba memasukkan komentar (menggunakan //atau /* */atau #misalnya), maka beberapa parser akan gagal karena ini benar-benar tidak dalam spesifikasi JSON. Jadi Anda tidak boleh melakukan itu.
Sebagai contoh, di mana sistem manipulasi gambar saya telah menyimpan notasi gambar dan beberapa informasi dasar yang diformat (komentar) yang terkait dengannya (di bagian bawah):
{"Notations":[{"anchorX":333,"anchorY":265,"areaMode":"Ellipse","extentX":356,"extentY":294,"opacity":0.5,"text":"Elliptical area on top","textX":333,"textY":265,"title":"Notation 1"},{"anchorX":87,"anchorY":385,"areaMode":"Rectangle","extentX":109,"extentY":412,"opacity":0.5,"text":"Rect area\non bottom","textX":98,"textY":385,"title":"Notation 2"},{"anchorX":69,"anchorY":104,"areaMode":"Polygon","extentX":102,"extentY":136,"opacity":0.5,"pointList":[{"i":0,"x":83,"y":104},{"i":1,"x":69,"y":136},{"i":2,"x":102,"y":132},{"i":3,"x":83,"y":104}],"text":"Simple polygon","textX":85,"textY":104,"title":"Notation 3"}],"imageXW":512,"imageYW":512,"imageName":"lena_std.ato","tinyDocs":{"c01":"JSON image notation data:","c02":"-------------------------","c03":"","c04":"This data contains image notations and related area","c05":"selection information that provides a means for an","c06":"image gallery to display notations with elliptical,","c07":"rectangular, polygonal or freehand area indications","c08":"over an image displayed to a gallery visitor.","c09":"","c10":"X and Y positions are all in image space. The image","c11":"resolution is given as imageXW and imageYW, which","c12":"you use to scale the notation areas to their proper","c13":"locations and sizes for your display of the image,","c14":"regardless of scale.","c15":"","c16":"For Ellipses, anchor is the center of the ellipse,","c17":"and the extents are the X and Y radii respectively.","c18":"","c19":"For Rectangles, the anchor is the top left and the","c20":"extents are the bottom right.","c21":"","c22":"For Freehand and Polygon area modes, the pointList","c23":"contains a series of numbered XY points. If the area","c24":"is closed, the last point will be the same as the","c25":"first, so all you have to be concerned with is drawing","c26":"lines between the points in the list. Anchor and extent","c27":"are set to the top left and bottom right of the indicated","c28":"region, and can be used as a simplistic rectangular","c29":"detect for the mouse hover position over these types","c30":"of areas.","c31":"","c32":"The textx and texty positions provide basic positioning","c33":"information to help you locate the text information","c34":"in a reasonable location associated with the area","c35":"indication.","c36":"","c37":"Opacity is a value between 0 and 1, where .5 represents","c38":"a 50% opaque backdrop and 1.0 represents a fully opaque","c39":"backdrop. Recommendation is that regions be drawn","c40":"only if the user hovers the pointer over the image,","c41":"and that the text associated with the regions be drawn","c42":"only if the user hovers the pointer over the indicated","c43":"region."}}
Tautan "penalaran" rusak. Adakah peluang untuk menemukan tautan saat ini?
Don Hatch
Don, sayangnya, Google telah membunuh sistem media sosial yang berisi pos; Saya tidak tahu ke mana poster aslinya pergi dari sana, jika ada di mana saja. Saya akan membunuh tautan di info di atas, untuk menghapus ambiguitas. Terima kasih.
fyngyrz
Alasannya tidak bodoh, dan Anda baru saja membuktikannya. Menerapkan komentar sebagai tag menjaga interoperabilitas . Ini adalah persis mengapa Crockford ingin komentar dapat dipecah sebagai tag. Sekarang semuanya hanya sebuah tag dan diuraikan dengan cara yang sama .
Dominic Cerisano
Jika spec menyatakan bahwa "baris yang dimulai dengan # adalah komentar", maka itu akan sepenuhnya dapat dioperasikan. Seperti yang sudah ada, komentar sama-sama memuat ruang parser, karena mereka adalah item yang diurai yang diuraikan daripada dipahami sebagai komentar, dan mereka dapat berbeda untuk setiap file .json yang ada. Sedangkan jika (misalnya) spec mengatakan "baris yang dimulai dengan # adalah komentar", maka parser dapat melewati baris tersebut tanpa penguraian (lebih cepat) dan tidak memuat ruang parser (pemanfaatan memori yang lebih baik.) Tidak ada manfaat sama sekali dari kekurangan komentar di .json, hanya kerugiannya.
fyngyrz
11
Untuk memotong item JSON menjadi beberapa bagian, saya menambahkan baris "komentar tiruan":
Anda telah meniru struktur file INI di JSON. Tolong, letakkan Golden Hammer Anda.
Artur Czajka
4
RFC mengatakan "Nama-nama dalam suatu objek HARUS unik". Lihat juga orang ini yang mengalami kesalahan dalam mem-parsing JSON seperti di atas: stackoverflow.com/questions/4912386/…
William Entriken
Jika Anda menggunakan skema untuk memvalidasi JSON, itu mungkin gagal karena bidang tambahan.
gregsdennis
1
Jika Anda benar-benar bertekad untuk menambahkan komentar ke JSON Anda, akan jauh lebih masuk akal untuk melakukan sesuatu seperti ini: { "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." } Ini membuat namanya unik dan memungkinkan Anda menambahkan nilai string apa pun yang Anda suka. Itu masih kludge, karena komentar tidak boleh menjadi bagian dari JSON Anda. Sebagai alternatif lain, mengapa tidak menambahkan komentar sebelum atau setelah JSON Anda, tetapi tidak di dalamnya?
//comments
boleh untuk kasus penggunaan tertentu dari file konfigurasi Sublime Text, jawabannya adalah ya (pada versi 2). Sublime Text tidak akan mengeluh tentang itu, setidaknya, sedangkan itu akan mengeluh tentang{"__comment": ...}
di konsol, karena itu adalah bidang yang tidak terduga.Jawaban:
Tidak.
Semua JSON harus berupa data, dan jika Anda memasukkan komentar, maka itu juga akan menjadi data.
Anda bisa memiliki elemen data yang ditunjuk yang disebut
"_comment"
(atau sesuatu) yang akan diabaikan oleh aplikasi yang menggunakan data JSON.Anda mungkin akan lebih baik memiliki komentar dalam proses yang menghasilkan / menerima JSON, karena mereka seharusnya tahu apa yang akan menjadi data JSON di muka, atau setidaknya struktur itu.
Tetapi jika Anda memutuskan untuk:
sumber
"__comment":"comment text goes here...",
Accronym
danAbbrev
? Saya telah menggunakan pola ini sebelumnya tetapi berhenti karena tidak memungkinkan saya untuk melakukan itu. Itu adalah hack. Mungkin jika saya menambahkan nama properti__comment__
sebagai gantinya. Itu adalah "__comment__Abbrev", masih merupakan peretasan, tapi saya akan mengomentari semua prpoertiesTidak , komentar formulir
//…
atau/*…*/
tidak diizinkan di JSON. Jawaban ini didasarkan pada:application/json
Jenis Media untuk Notasi Objek JavaScript (JSON)sumber
Sertakan komentar jika Anda memilih; strip mereka dengan minifier sebelum parsing atau mentransmisikan.
Saya baru saja merilis JSON.minify () yang menghapus komentar dan spasi putih dari blok JSON dan menjadikannya JSON yang valid yang dapat diuraikan. Jadi, Anda dapat menggunakannya seperti:
Ketika saya merilisnya, saya mendapat reaksi besar dari orang-orang yang tidak setuju bahkan dengan gagasan itu, jadi saya memutuskan bahwa saya akan menulis posting blog yang komprehensif tentang mengapa komentar masuk akal di JSON . Ini termasuk komentar penting dari pencipta JSON:
Semoga bermanfaat bagi mereka yang tidak setuju mengapa JSON.minify () dapat bermanfaat.
sumber
Komentar dihapus dari JSON oleh desain.
Sumber: Pernyataan publik oleh Douglas Crockford tentang G +
sumber
PENOLAKAN: GARANSI ANDA TIDAK BISA
Seperti yang telah ditunjukkan, peretasan ini mengambil keuntungan dari implementasi spesifikasi. Tidak semua parser JSON akan memahami JSON semacam ini. Pengurai aliran secara khusus akan tersedak.
Ini merupakan keingintahuan yang menarik, tetapi Anda seharusnya tidak menggunakannya untuk apa pun . Di bawah ini adalah jawaban asli.
Saya telah menemukan hack kecil yang memungkinkan Anda untuk menempatkan komentar di file JSON yang tidak akan memengaruhi parsing, atau mengubah data yang diwakili dengan cara apa pun.
Tampaknya ketika mendeklarasikan objek literal Anda dapat menentukan dua nilai dengan kunci yang sama, dan yang terakhir diutamakan. Percaya atau tidak, ternyata parser JSON bekerja dengan cara yang sama. Jadi kita dapat menggunakan ini untuk membuat komentar di JSON sumber yang tidak akan hadir dalam representasi objek yang diuraikan.
Jika kami menerapkan teknik ini, file JSON Anda yang dikomentari mungkin terlihat seperti ini:
Kode di atas adalah JSON yang valid . Jika Anda menguraikannya, Anda akan mendapatkan objek seperti ini:
Yang berarti tidak ada jejak komentar, dan mereka tidak akan memiliki efek samping yang aneh.
Selamat melakukan peretasan!
sumber
JSON tidak mendukung komentar. Itu juga tidak pernah dimaksudkan untuk digunakan untuk file konfigurasi di mana komentar akan diperlukan.
Hjson adalah format file konfigurasi untuk manusia. Sintaks santai, lebih sedikit kesalahan, lebih banyak komentar.
Lihat hjson.org untuk perpustakaan JavaScript, Java, Python, PHP, Rust, Go, Ruby dan C #.
sumber
Pertimbangkan untuk menggunakan YAML. Ini hampir superset dari JSON (hampir semua JSON yang valid adalah YAML yang valid) dan memungkinkan komentar.
sumber
yaml
pustaka tidak dikirimkan dengan Python.Kamu tidak bisa Setidaknya itulah pengalaman saya dari pandangan sekilas di json.org .
JSON memiliki sintaksis yang divisualisasikan pada halaman itu. Tidak ada catatan tentang komentar.
sumber
Komentar bukanlah standar resmi, meskipun beberapa parser mendukung komentar gaya C ++. Salah satu yang saya gunakan adalah JsonCpp . Dalam contohnya ada yang ini:
jsonlint tidak memvalidasi ini. Jadi komentar adalah ekstensi spesifik parser dan bukan standar.
Parser lain adalah JSON5 .
Alternatif untuk JSON TOML .
Alternatif selanjutnya adalah jsonc .
sumber
Anda harus menulis skema JSON sebagai gantinya. Skema JSON saat ini merupakan spesifikasi rancangan Internet yang diusulkan. Selain dokumentasi, skema ini juga dapat digunakan untuk memvalidasi data JSON Anda.
Contoh:
Anda dapat memberikan dokumentasi dengan menggunakan atribut skema deskripsi .
sumber
Jika Anda menggunakan Jackson sebagai parser JSON, maka inilah cara Anda mengaktifkannya untuk mengizinkan komentar:
Maka Anda dapat memiliki komentar seperti ini:
Dan Anda juga dapat memiliki komentar yang dimulai dengan
#
menetapkan:Tetapi secara umum (seperti yang dijawab sebelumnya) spesifikasi tidak mengizinkan komentar.
sumber
Inilah yang saya temukan dalam dokumentasi Google Firebase yang memungkinkan Anda untuk memberikan komentar di JSON:
sumber
TIDAK . JSON digunakan untuk mendukung komentar, tetapi mereka dilecehkan dan dihapus dari standar.
Dari pencipta JSON:
Situs resmi JSON ada di JSON.org . JSON didefinisikan sebagai standar oleh ECMA International. Selalu ada proses petisi untuk merevisi standar. Kecil kemungkinan bahwa anotasi akan ditambahkan ke standar JSON karena beberapa alasan.
JSON by design adalah alternatif XML yang mudah direkayasa ulang (diurai manusia). Ini disederhanakan bahkan ke titik bahwa penjelasan tidak perlu. Itu bahkan bukan bahasa markup. Tujuannya adalah stabilitas dan interoperablilty.
Siapa pun yang memahami hubungan orientasi objek "has-a" dapat memahami setiap struktur JSON - itulah intinya. Ini hanya grafik asiklik terarah (DAG) dengan tag node (pasangan kunci / nilai), yang merupakan struktur data hampir universal.
Anotasi ini hanya diperlukan mungkin "// Ini adalah tag DAG". Nama-nama kunci dapat informatif seperti yang diperlukan, memungkinkan arity semantik sewenang-wenang.
Platform apa pun dapat mengurai JSON hanya dengan beberapa baris kode. XML membutuhkan pustaka OO kompleks yang tidak dapat dijalankan pada banyak platform.
Penjelasan hanya akan membuat JSON membuat lebih sedikit interoperable. Tidak ada hal lain untuk ditambahkan, kecuali apa yang benar-benar Anda butuhkan adalah bahasa markup (XML), dan tidak peduli jika data Anda yang bertahan mudah diurai.
TETAPI seperti yang diamati oleh pembuat JSON, selalu ada dukungan pipeline JS untuk komentar:
sumber
Jika file teks Anda, yang merupakan string JSON, akan dibaca oleh beberapa program, seberapa sulitkah untuk menghapus komentar gaya C atau C ++ sebelum menggunakannya?
Jawaban: Itu akan menjadi satu liner. Jika Anda melakukannya, file JSON dapat digunakan sebagai file konfigurasi.
sumber
Jika Anda menggunakan pustaka Newtonsoft.Json dengan ASP.NET untuk membaca / deserialize Anda dapat menggunakan komentar dalam konten JSON:
atau
PS: Komentar single-line hanya didukung dengan 6+ versi Newtonsoft Json.
Catatan tambahan untuk orang-orang yang tidak bisa berpikir di luar kotak: Saya menggunakan format JSON untuk pengaturan dasar dalam aplikasi web ASP.NET yang saya buat. Saya membaca file, mengubahnya menjadi objek pengaturan dengan pustaka Newtonsoft dan menggunakannya saat diperlukan.
Saya lebih suka menulis komentar tentang masing-masing pengaturan individu dalam file JSON itu sendiri, dan saya benar-benar tidak peduli tentang integritas format JSON selama perpustakaan yang saya gunakan tidak masalah.
Saya pikir ini adalah cara yang 'lebih mudah digunakan / dipahami' daripada membuat file 'settings.README' yang terpisah dan menjelaskan pengaturan di dalamnya.
Jika Anda memiliki masalah dengan penggunaan seperti ini; maaf, jin sudah keluar dari lampu. Orang akan menemukan penggunaan lain untuk format JSON, dan tidak ada yang dapat Anda lakukan untuk itu.
sumber
Gagasan di balik JSON adalah untuk menyediakan pertukaran data sederhana antar aplikasi. Ini biasanya berbasis web dan bahasanya adalah JavaScript.
Itu tidak benar-benar memungkinkan untuk komentar seperti itu, namun, memberikan komentar sebagai salah satu pasangan nama / nilai dalam data pasti akan berfungsi, meskipun data itu jelas perlu diabaikan atau ditangani secara khusus oleh kode parsing.
Semua yang dikatakan, itu bukan maksud bahwa file JSON harus mengandung komentar dalam arti tradisional. Seharusnya hanya data.
Lihat situs web JSON untuk detail lebih lanjut.
sumber
Saya hanya menemukan ini untuk file konfigurasi. Saya tidak ingin menggunakan XML (verbose, grafis, jelek, sulit dibaca), atau "ini" (tidak ada hierarki, tidak ada standar nyata, dll.) Atau format Java "Properties" (seperti .ini).
JSON dapat melakukan semua yang dapat mereka lakukan, tetapi cara ini lebih tidak jelas dan lebih dapat dibaca manusia - dan parser mudah dan ada di mana-mana dalam banyak bahasa. Itu hanya sebatang data. Tetapi komentar out-of-band sering diperlukan untuk mendokumentasikan konfigurasi "default" dan sejenisnya. Konfigurasi tidak pernah menjadi "dokumen lengkap", tetapi pohon data yang disimpan yang dapat dibaca manusia saat dibutuhkan.
Saya kira orang bisa menggunakan
"#": "comment"
, untuk JSON "valid".sumber
JSON tidak mendukung komentar secara native, tetapi Anda dapat membuat dekoder sendiri atau setidaknya preprocessor untuk menghapus komentar, itu baik-baik saja (selama Anda mengabaikan komentar dan tidak menggunakannya untuk memandu bagaimana aplikasi Anda harus memproses data JSON ).
Cf: Douglas Crockford, penulis spec JSON .
sumber
Itu tergantung pada perpustakaan JSON Anda. Json.NET mendukung komentar gaya JavaScript,
/* commment */
,.Lihat pertanyaan Stack Overflow lainnya .
sumber
JSON sangat masuk akal untuk file konfigurasi dan penggunaan lokal lainnya karena ini ada di mana-mana dan karena itu jauh lebih sederhana daripada XML.
Jika orang memiliki alasan kuat untuk tidak memiliki komentar di JSON saat berkomunikasi data (apakah valid atau tidak), maka kemungkinan JSON dapat dibagi menjadi dua:
JSON-DOC akan memungkinkan komentar, dan perbedaan kecil lainnya mungkin ada seperti menangani spasi. Parser dapat dengan mudah mengkonversi dari satu spec ke yang lainnya.
Berkenaan dengan komentar yang dibuat oleh Douglas Crockford tentang masalah ini (dirujuk oleh @Artur Czajka)
Kita berbicara tentang masalah file konfigurasi umum (lintas bahasa / platform), dan dia menjawab dengan utilitas khusus JS!
Tentu saja minify khusus JSON dapat diimplementasikan dalam bahasa apa pun, tetapi distandarisasi ini sehingga menjadi di mana-mana di parser dalam semua bahasa dan platform sehingga orang berhenti membuang-buang waktu mereka kekurangan fitur karena mereka memiliki kasus penggunaan yang baik untuk itu, mencari masalah di forum online, dan membuat orang memberi tahu mereka bahwa itu adalah ide yang buruk atau menyarankan itu mudah untuk menerapkan pengupasan komentar dari file teks.
Masalah lainnya adalah interoperabilitas. Misalkan Anda memiliki perpustakaan atau API atau jenis subsistem apa pun yang memiliki beberapa file konfigurasi atau data yang terkait dengannya. Dan subsistem ini harus diakses dari berbagai bahasa. Lalu, apakah Anda memberi tahu orang-orang: omong-omong jangan lupa menghapus komentar dari file JSON sebelum meneruskannya ke parser!
sumber
Jika Anda menggunakan JSON5 Anda dapat memasukkan komentar.
JSON5 adalah ekstensi yang diusulkan ke JSON yang bertujuan untuk memudahkan manusia menulis dan memelihara dengan tangan. Ini dilakukan dengan menambahkan beberapa fitur sintaks minimal langsung dari ECMAScript 5.
sumber
Toolkit JavaScript Dojo Toolkit (setidaknya pada versi 1.4), memungkinkan Anda untuk memasukkan komentar dalam JSON Anda. Komentar dapat dalam
/* */
format. Dojo Toolkit mengkonsumsi JSON melaluidojo.xhrGet()
panggilan.Toolkit JavaScript lainnya dapat bekerja dengan cara yang sama.
Ini dapat membantu ketika bereksperimen dengan struktur data alternatif (atau bahkan daftar data) sebelum memilih opsi final.
sumber
dojo.xhrGet()
secara implisit mendorong dengan menerima.JSON bukan protokol berbingkai . Ini adalah format bebas bahasa . Jadi format komentar tidak ditentukan untuk JSON.
Seperti yang disarankan banyak orang, ada beberapa trik, misalnya, kunci duplikat atau kunci tertentu
_comment
yang dapat Anda gunakan. Terserah kamu.sumber
Anda dapat memiliki komentar di JSONP , tetapi tidak di JSON murni. Saya baru saja menghabiskan satu jam mencoba untuk membuat program saya bekerja dengan contoh ini dari Highcharts: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?
Jika Anda mengikuti tautan, Anda akan melihat
Karena saya memiliki file serupa di folder lokal saya, tidak ada masalah dengan kebijakan asal-sama , jadi saya memutuskan untuk menggunakan JSON murni ... dan, tentu saja,
$.getJSON
gagal diam-diam karena komentar.Akhirnya saya baru saja mengirim permintaan HTTP manual ke alamat di atas dan menyadari bahwa tipe konten
text/javascript
sejak itu , yah, JSONP mengembalikan JavaScript murni. Dalam hal ini komentar diperbolehkan . Tetapi aplikasi saya mengembalikan tipe kontenapplication/json
, jadi saya harus menghapus komentar.sumber
Ini adalah pertanyaan "bisakah kamu" . Dan inilah jawaban "ya" .
Tidak, Anda tidak boleh menggunakan anggota objek duplikat untuk memasukkan data saluran sisi ke dalam pengkodean JSON. (Lihat "Nama-nama dalam suatu objek HARUS unik" di RFC ).
Dan ya, Anda bisa menyisipkan komentar di sekitar JSON , yang dapat Anda uraikan.
Tetapi jika Anda ingin cara memasukkan dan mengekstrak data saluran samping sewenang-wenang ke JSON yang valid, berikut ini jawabannya. Kami mengambil keuntungan dari representasi data yang tidak unik dalam penyandian JSON. Ini diperbolehkan * di bagian dua RFC di bawah "spasi putih diizinkan sebelum atau setelah salah satu dari enam karakter struktural".
* RFC hanya menyatakan "spasi putih diizinkan sebelum atau sesudah salah satu dari enam karakter struktural", tidak secara eksplisit menyebutkan string, angka, "false", "true", dan "null". Kelalaian ini diabaikan dalam SEMUA implementasi.
Pertama, dikanonisasi JSON Anda dengan mengecilkannya:
Kemudian, enkode komentar Anda dalam biner:
Kemudian hentikan biner Anda:
Ini output Anda:
sumber
DISCLAIMER: INI SILLY
Sebenarnya ada cara untuk menambahkan komentar, dan tetap dalam spesifikasi (tidak perlu parser tambahan). Itu tidak akan menghasilkan komentar yang dapat dibaca manusia tanpa semacam parsing sekalipun.
Anda dapat menyalahgunakan yang berikut ini:
Dengan cara meretas, Anda dapat menyalahgunakan ini untuk menambahkan komentar. Misalnya: mulai dan akhiri komentar Anda dengan sebuah tab. Encode komentar di base3 dan gunakan karakter spasi putih lain untuk mewakili mereka. Contohnya.
(
hello base three
dalam ASCII) Tetapi alih-alih menggunakan 0 ruang, untuk 1 menggunakan umpan baris dan untuk 2 menggunakan carriage return.Ini hanya akan meninggalkan Anda dengan banyak ruang kosong yang tidak dapat dibaca (kecuali jika Anda membuat plugin IDE untuk menyandikan / mendekodekannya dengan cepat).
Saya bahkan tidak pernah mencoba ini, untuk alasan yang jelas dan Anda juga tidak.
sumber
Kami menggunakan
strip-json-comments
untuk proyek kami. Ini mendukung sesuatu seperti:Cukup
npm install --save strip-json-comments
untuk menginstal dan menggunakannya seperti:sumber
json
ini bukan JSON yang valid lagi saat menyertakan komentar kesopanan ini.Dalam kasus saya, saya perlu menggunakan komentar untuk keperluan debug, sebelum output dari struktur JSON. Jadi saya memutuskan untuk menggunakan informasi debug di header HTTP, untuk menghindari pemecahan klien:
sumber
JSON tidak mengizinkan komentar. Penalarannya benar-benar bodoh, karena Anda dapat menggunakan JSON sendiri untuk membuat komentar, yang sepenuhnya meniadakan penalaran, dan memuat ruang data parser tanpa alasan yang baik sama sekali untuk hasil dan potensi masalah yang persis sama, seperti: JSON file dengan komentar.
Sebagai contoh, di mana sistem manipulasi gambar saya telah menyimpan notasi gambar dan beberapa informasi dasar yang diformat (komentar) yang terkait dengannya (di bagian bawah):
sumber
Untuk memotong item JSON menjadi beberapa bagian, saya menambahkan baris "komentar tiruan":
sumber
{ "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." }
Ini membuat namanya unik dan memungkinkan Anda menambahkan nilai string apa pun yang Anda suka. Itu masih kludge, karena komentar tidak boleh menjadi bagian dari JSON Anda. Sebagai alternatif lain, mengapa tidak menambahkan komentar sebelum atau setelah JSON Anda, tetapi tidak di dalamnya?