it-swarm.asia

Bisakah komentar digunakan di JSON?

Bisakah saya menggunakan komentar di dalam file JSON? Jika ya, bagaimana caranya?

6269
Michael Gundlach

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 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"
            }
         }
      }
   }
}
4475
Eli

Tidak, komentar dari bentuk //… atau /*…*/ tidak diizinkan di JSON. Jawaban ini didasarkan pada:

  • http://www.json.org
  • RFC 4627 : application/json Jenis Media untuk Notasi Objek JavaScript (JSON)
  • RFC 7159 JavaScript Object Notation (JSON) Format Pertukaran Data - Obsoletes: 4627, 7158
1640
stakx

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 ide itu, jadi saya memutuskan untuk 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.

720
Kyle Simpson

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.

Sumber: Pernyataan publik oleh Douglas Crockford pada G +

393
Artur Czajka

PENOLAKAN: GARANSI ANDA IS 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 rasa ingin tahu yang menarik, tetapi Anda seharusnya tidak menggunakannya sama sekali. Di bawah ini adalah jawaban asli.


Saya telah menemukan hack kecil yang memungkinkan Anda untuk menempatkan komentar di file JSON yang tidak akan mempengaruhi penguraian, 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 bisa menggunakan ini untuk membuat komentar di JSON sumber yang tidak akan hadir dalam representasi objek yang diuraikan. 

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

Jika kami menerapkan teknik ini, file JSON komentar Anda 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:

{
    "api_Host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

Yang berarti tidak ada jejak komentar, dan mereka tidak akan memiliki efek samping yang aneh.

Selamat melakukan peretasan!

198
Ped

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.

 Hjson intro

Lihat hjson.org untuk JavaScript, Java, Python, PHP, Rust, Go, Ruby dan pustaka C #.

140
laktak

Kamu tidak bisa Setidaknya itulah pengalaman saya dari sekilas di json.org .

JSON memiliki sintaksis yang divisualisasikan pada halaman itu. Tidak ada catatan tentang komentar.

97
Cheery

Pertimbangkan untuk menggunakan YAML. Ini hampir superset dari JSON (hampir semua JSON yang valid adalah YAML yang valid) dan memungkinkan komentar.

95

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:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

Anda dapat memberikan dokumentasi dengan menggunakan atribut skema description.

58
raffel

Jika Anda menggunakan Jackson sebagai parser JSON Anda, maka inilah cara Anda mengaktifkannya untuk mengizinkan komentar:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

Maka Anda dapat memiliki komentar seperti ini:

{
  key: "value" // Comment
}

Dan Anda juga dapat memiliki komentar yang dimulai dengan # dengan menetapkan:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Namun secara umum (seperti yang dijawab sebelumnya) spesifikasi tidak mengizinkan komentar.

56
Andrejs

Komentar bukan 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.

Parser lain adalah JSON5 .

Alternatif untuk JSON TOML .

53
schoetbi

Inilah yang saya temukan di 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"
}
44
mana

Maaf, kami tidak dapat menggunakan komentar di JSON ... Lihat diagram sintaks untuk JSON di JSON.org .

Douglas Crockford mengatakan " mengapa dia menghapus komentar di JSON dan memberikan cara alternatif untuk melakukan itu ":

Saya menghapus komentar dari JSON karena saya melihat orang-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 Anda ingin membubuhi keterangan. Silakan masukkan semua komentar yang Anda suka . Kemudian pipa melalui JSMin sebelum menyerahkannya ke parser JSON Anda.

40
NavaRajan

Jika file teks Anda, yang merupakan string JSON, akan dibaca oleh beberapa program, seberapa sulitkah untuk menghapus komentar gaya C atau C++ sebelum menggunakannya?

Jawab: Ini akan menjadi satu liner. Jika Anda melakukannya, file JSON dapat digunakan sebagai file konfigurasi.

37
John T. Vonachen

Jika Anda menggunakan perpustakaan 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 baris tunggal hanya didukung dengan 6+ versi Newtonsoft Json.

Catatan tambahan untuk orang-orang yang tidak bisa berpikir keluar dari kotak: Saya menggunakan format JSON untuk pengaturan dasar dalam aplikasi web ASP.NET yang saya buat. Saya membaca file, mengubahnya menjadi objek pengaturan dengan perpustakaan 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.

33
dvdmn

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, bagaimanapun, 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.

Lihatlah situs web JSON untuk lebih jelasnya.

28
Neil Albrock

Saya hanya menemukan ini untuk file konfigurasi. Saya tidak ingin menggunakanXML(verbose, grafis, jelek, sulit dibaca), atau format "ini" (tanpa 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".

27
peterk

JSON tidak mendukung komentar secara native, tetapi Anda dapat membuat dekoder sendiri atau setidaknya preprosesor 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. Itu adalah untuk apa JSON.

Cf: Douglas Crockford, penulis spec JSON .

26
gaborous

Itu tergantung pada pustaka JSON Anda. Json.NET mendukung komentar gaya JavaScript, /* commment */.

Lihat pertanyaan Stack Overflow lainnya .

26
AZ.

JSON membuat banyak 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 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. 

Sehubungan dengan komentar 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 seluruh 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 mengeluarkan masalah di forum online, dan membuat orang memberi tahu mereka bahwa itu adalah ide yang buruk atau menyarankan agar mudah menerapkan pengupasan komentar dari file teks.

Masalah lainnya adalah interoperabilitas. Misalkan Anda memiliki perpustakaan atau API atau subsistem apa pun yang memiliki beberapa file konfigurasi atau data yang terkait dengannya. Dan subsistem ini akan diakses dari berbagai bahasa. Lalu, apakah Anda ingin memberi tahu orang-orang: omong-omong Jangan lupa untuk menghapus komentar dari file JSON sebelum meneruskannya ke parser!

23
Basel Shishani

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.

20
Smit Johnth

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 panggilan dojo.xhrGet().

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.

20
David

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 _comment tertentu yang dapat Anda gunakan. Terserah kamu.

17

Anda dapat memiliki komentar di JSONP , tetapi tidak dalam JSON murni. Saya baru saja menghabiskan satu jam mencoba 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

?(/* 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 Same-Origin , jadi saya memutuskan untuk menggunakan JSON murni ... dan, tentu saja, $.getJSON gagal diam-diam karena komentar.

Akhirnya saya hanya mengirim permintaan HTTP manual ke alamat di atas dan menyadari bahwa tipe kontennya adalah text/javascript karena, yah, JSONP mengembalikan JavaScript murni. Dalam hal ini komentar diizinkan. Tetapi aplikasi saya mengembalikan tipe konten application/json, jadi saya harus menghapus komentar.

17
osa

Ini adalah pertanyaan "can you". 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 objek HARUS unik" dalam RFC ).

Dan ya, Anda bisa menyisipkan komentar sekitar JSON , yang bisa Anda uraikan.

Tetapi jika Anda ingin cara memasukkan dan mengekstraksi data saluran samping sewenang-wenang ke JSON yang valid, berikut ini jawabannya. Kami memanfaatkan representasi data yang tidak unik dalam penyandian JSON. Ini dibolehkan* di bagian dua RFC di bawah "spasi putih diizinkan sebelum atau sesudah salah satu dari keenam karakter struktural".

*RFC hanya menyatakan "spasi putih diizinkan sebelum atau setelah salah satu dari keenam karakter struktural", tidak secara eksplisit menyebutkan string, angka, "false", "true", dan "null". Kelalaian ini diabaikan dalam SEMUA implementasi.


Pertama, dikanonisasi JSON Anda dengan mengecilkannya:

$jsonMin = json_encode(json_decode($json));

Kemudian, enkode komentar Anda dalam biner:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

Kemudian hentikan biner Anda:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

Ini output Anda:

$jsonWithComment = $steg . $jsonMin;
16
William Entriken

Kami menggunakan strip-json-comments untuk proyek kami. Ini mendukung sesuatu seperti:

/*
 * Description 
*/
{
    // rainbows
    "Unicorn": /* ❤ */ "cake"
}

Cukup npm install --save strip-json-comments untuk menginstal dan menggunakannya seperti:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"Unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {Unicorn: 'cake'}
11
Joy

Ada solusi yang bagus (retas), yaitu JSON yang valid. .__ Cukup buat kunci yang sama dua kali (atau lebih). Sebagai contoh: 

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

Jadi JSON akan memahami ini sebagai:

{
  "param" : "This is value place",
}
10
Aurimas

Untuk memotong item JSON menjadi beberapa bagian, saya menambahkan baris "komentar tiruan":

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}
10
Chris

JSON digunakan untuk mendukung komentar, tetapi mereka disalahgunakan dan dihapus dari standar.

Dari pencipta JSON:

Saya menghapus komentar dari JSON karena saya melihat orang-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 universal yang dekat.

Anotasi ini hanya diperlukan mungkin "// Ini adalah tag DAG". Nama-nama kunci dapat informatif seperti yang diperlukan.

Platform apa pun dapat mengurai JSON hanya dengan beberapa baris kode. XML membutuhkan pustaka OO yang kompleks yang tidak dapat dijalankan di banyak platform.

Penjelasan hanya akan membuat JSON membuat lebih sedikit interoperable. Tidak ada lagi yang perlu ditambahkan, kecuali apa yang benar-benar Anda butuhkan adalah bahasa markup (XML), dan tidak peduli apakah data Anda yang bertahan mudah diurai.

9
Dominic Cerisano

Penulis JSON ingin kita memasukkan komentar dalam JSON, tetapi menghapusnya sebelum menguraikannya (lihat tautan disediakan oleh Michael Burr). Jika JSON harus memiliki komentar, mengapa tidak membakukannya, dan biarkan parser JSON melakukan pekerjaan itu? Saya tidak setuju dengan logika di sana, tapi, sayangnya, itu standarnya. Menggunakan solusi YAML seperti yang disarankan oleh orang lain adalah baik, tetapi membutuhkan ketergantungan perpustakaan.

Jika Anda ingin menghapus komentar, tetapi tidak ingin memiliki ketergantungan perpustakaan, berikut ini adalah solusi dua baris, yang berfungsi untuk komentar gaya C++, tetapi dapat disesuaikan dengan yang lain:

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

Perhatikan bahwa solusi ini hanya dapat digunakan dalam kasus di mana Anda dapat yakin bahwa data JSON tidak mengandung inisiator komentar, mis. ('//').

Cara lain untuk mencapai penguraian JSON, stripping komentar, dan tidak ada perpustakaan tambahan, adalah mengevaluasi JSON dalam penerjemah JavaScript. Peringatan dengan pendekatan itu, tentu saja, adalah bahwa Anda hanya ingin mengevaluasi data yang tidak ternoda (tidak ada input pengguna yang tidak dipercaya). Berikut adalah contoh dari pendekatan ini di Node.js - peringatan lain, contoh berikut hanya akan membaca data sekali dan kemudian akan di-cache:

data = require(fs.realpathSync(doctree_fp));
9

Mendesah. Mengapa tidak menambahkan bidang saja, mis.

{
    "note1" : "This demonstrates the provision of annotations within a JSON file",
    "field1" : 12,
    "field2" : "some text",

    "note2" : "Add more annotations as necessary"
}

Pastikan nama "notex" Anda tidak bertentangan dengan bidang nyata.

7
Steve Thomas

Anda dapat menggunakan JSON dengan komentar di dalamnya, jika Anda memuatnya sebagai file teks, dan kemudian menghapus komentar dari itu.

Anda dapat menggunakan decomment library untuk itu. Di bawah ini adalah contoh lengkap.

Input JSON (file input.js):

/*
* multi-line comments
**/
{
    "value": 123 // one-line comment
}

Aplikasi Tes:

var decomment = require('decomment');
var fs = require('fs');

fs.readFile('input.js', 'utf8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        var text = decomment(data); // removing comments
        var json = JSON.parse(text); // parsing JSON
        console.log(json);
    }
});

Keluaran:

{ value: 123 }

Lihat juga: tegukan-decomment , grunt-decomment

7
vitaly-t

Saya baru saja menemukan " grunt-strip-json-comments ".

“Hapus komentar dari JSON. Itu memungkinkan Anda menggunakan komentar di file JSON Anda! ”

{
    // Rainbows
    "Unicorn": /* ❤ */ "cake"
}

Jika konteks Anda adalah konfigurasi Node.js, Anda dapat mempertimbangkan JavaScript melalui module.exports sebagai alternatif untuk JSON:

module.exports = {
    "key": "value",

    // And with comments!
    "key2": "value2"
};

Sintaks require akan tetap sama. Menjadi JavaScript, ekstensi file harus .js.

4
Nick

Dalam kasus saya, saya perlu menggunakan komentar untuk keperluan debug, sebelum output struktur JSON. Jadi saya memutuskan untuk menggunakan informasi debug di header HTTP, untuk menghindari kerusakan klien:

header("My-Json-Comment: Yes, I know it's a workaround ;-) ");

 Enter image description here

4
WilliamK

Anda dapat menggunakan preprocessing sederhana melalui ekspresi reguler. Misalnya, fungsi berikut akan mendekode JSON yang dikomentari di PHP:

function json_decode_commented ($data, $objectsAsArrays = false, $maxDepth = 512, $opts) {
  $data = preg_replace('~
    (" (?:[^"\\\\] | \\\\\\\\ | \\\\")*+ ") | \# [^\v]*+ | // [^\v]*+ | /\* .*? \*/
  ~xs', '$1', $data);

  return json_decode($data, $objectsAsArrays, $maxDepth, $opts);
}

Ini mendukung semua komentar gaya PHP:/*, #, //. String literal dipertahankan seperti apa adanya.

3

JSON tidak mengizinkan komentar, per se. Reasoning benar-benar bodoh, karena Anda dapat menggunakan JSON sendiri untuk membuat komentar, yang meniadakan penalaran sepenuhnya, dan memuat ruang data parser tanpa alasan yang baik sama sekali untuk persis hasil dan potensi masalah yang sama, seperti: file JSON dengan komentar.

Jika Anda mencoba untuk memasukkan komentar (menggunakan // atau /* */ atau # misalnya), maka beberapa parser akan gagal karena ini sama sekali bukan dalam spesifikasi JSON. Jadi Anda harus tidak pernah melakukannya.

Sebagai contoh, di mana sistem manipulasi gambar saya telah menyimpan notasi gambar dan beberapa informasi dasar yang diformat (komentar) yang berkaitan 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."
    }
}
3
fyngyrz

Jika Anda menggunakan PHP, Anda dapat menggunakan fungsi ini untuk mencari dan menghapus ///* ketik komentar dari string JSON sebelum menguraikannya ke dalam objek/array:

function json_clean_decode($json, $assoc = true, $depth = 512, $options = 0) {
       // search and remove comments like /* */ and //
       $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

       if(version_compare(phpversion(), '5.4.0', '>=')) {
           $json = json_decode($json, $assoc, $depth, $options);
       }
       elseif(version_compare(phpversion(), '5.3.0', '>=')) {
           $json = json_decode($json, $assoc, $depth);
       }
       else {
           $json = json_decode($json, $assoc);
       }

       return $json;
   }

Semoga ini membantu!

2
Meru-kun

Seperti yang telah ditunjukkan oleh banyak jawaban, JSON tidak memiliki komentar. Tentu saja terkadang Anda menginginkannya juga. Untuk Python, dua cara untuk melakukannya adalah dengan commentjson (# dan // hanya untuk Python 2) atau json_tricks (# atau // untuk Python 2 dan Python 3), yang memiliki beberapa lainnya fitur. Penafian: Saya membuat json_tricks.

2
Mark

Jawaban praktis untuk pengguna VSCode pada 2019 adalah dengan menggunakan ekstensi 'jsonc'.

Praktis, karena itulah ekstensi yang dikenali oleh VSCode untuk menunjukkan "JSON dengan komentar". Tolong beri tahu saya tentang editor/IDE lain di komentar di bawah.

Akan lebih baik jika VSCode dan editor lain akan menambahkan dukungan asli untuk 'json5' juga, tetapi untuk saat ini VSCode hanya menyertakan dukungan untuk 'jsonc'.

(Saya mencari semua jawaban sebelum memposting ini dan tidak ada yang menyebutkan 'jsonc'.)

1
Tom

Tentu Anda bisa berkomentar JSON. Untuk membaca file JSON yang dikomentari dari javascript, Anda dapat menghapus komentar sebelum menguraikannya (lihat kode di bawah). Saya yakin kode ini dapat ditingkatkan, tetapi mudah dimengerti bagi mereka yang menggunakan regexp.

Saya menggunakan file JSON yang dikomentari untuk menentukan bentuk neuron untuk sistem refleks sintetis saya. Saya juga menggunakan JSON yang dikomentari untuk menyimpan status perantara untuk sistem neuron yang sedang berjalan. Sangat nyaman untuk memiliki komentar. Jangan dengarkan didacts yang memberitahu Anda bahwa itu adalah ide yang buruk.

fetch(filename).then(function(response) {
    return response.text();
}).then(function(commented) {
    return commented.
        replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1').
        replace(/\r/,"\n").
        replace(/\n[\n]+/,"\n");
}).then(function(clean) {
    return JSON.parse(clean);
}).then(function(json) {
    // Do what you want with the JSON object.
});
1
jlettvin

Ya, Anda dapat memiliki komentar. Tetapi saya tidak akan merekomendasikan alasan apa pun yang disebutkan di atas.

Saya melakukan penyelidikan, dan saya menemukan semua JSON memerlukan metode menggunakan metode JSON.parse. Jadi saya sampai pada solusi: Kita bisa mengganti atau melakukan patch monyet di sekitar JSON.parse.

Catatan: hanya diuji pada Node.js ;-)

var oldParse = JSON.parse;
JSON.parse = parse;
function parse(json){
    json = json.replace(/\/\*.+\*\//, function(comment){
        console.log("comment:", comment);
        return "";
    });
    return oldParse(json)
}

File JSON:

{
  "test": 1
  /* Hello, babe */
}
1
xdeepakv

Anda dapat menggunakan JSON-LD dan schema.org comment ketik untuk menulis komentar: 

{
    "https://schema.org/comment": "this is a comment"
}
0
MovGP0

* .json file umumnya digunakan sebagai file konfigurasi atau data statis, sehingga kebutuhan komentar → beberapa editor seperti NetBeans menerima jcomment di * .json.

Masalahnya adalah penguraian konten ke suatu objek. Solusinya adalah untuk selalu menerapkan fungsi pembersihan (server atau klien).

PHP

 $rgx_arr = ["/\/\/[^\n]*/sim", "/\/\*.*?\*\//sim", "/[\n\r\t]/sim"];
 $valid_json_str = \preg_replace($rgx_arr, '', file_get_contents(path . '*.json'));

JavaScript

valid_json_str = json_str.replace(/\/\/[^\n]*/gim.'').replace(/\/\*.*?\*\//gim,'')
0
bortunac

Ada perpustakaan lain yang kompatibel dengan JSON, yang mendukung komentar.

Satu contoh penting adalah "Hashcorp Language" (HCL) " . Ini ditulis oleh orang yang sama yang membuat Vagrant, pengepak, konsul, dan lemari besi.

0
spuder

Keseluruhan utas ini menganggap bahwa menambahkan komentar adalah satu-satunya peningkatan yang perlu dilakukan ke JSON. Jika seseorang tidak ingin komentar di JSON karena akan digunakan untuk serialisasi, cukup abaikan komentar tersebut. Hal yang sama berlaku untuk spasi putih. Tapi mengapa berhenti di situ? Mengapa tanda kutip diperlukan di JSON? Mereka menambahkan tidak ada yang berguna.

Satu-satunya alasan saya bisa menganggap JSON begitu kaku adalah jika parsing sulit. Tapi ternyata tidak. Hampir semua programmer dapat menulis parser JSON, di kedua arah.

Saya ingin JSON mudah dibaca dan efisien (singkat), dan berguna untuk transmisi data, file konfigurasi, dan banyak lagi. Kedua persyaratan ini dipenuhi oleh contoh berikut:

{stringA: stringB, stringC: stringD, [stringE, stringF]}

Lebih pendek dari spesifikasi JSON yang ada, tetapi sama mudah dibaca dan lebih efisien.

Perlu menyertakan tanda kutip, tanda kutip, koma, atau tanda kurung di properti atau nilai? Cukup lampirkan di tanda tanya atau apostrof (dengan backslash escape), seperti di JavaScript.

Tapi tolong buat tanda kutip opsional. Mengapa? Karena JSON tidak dapat berisi nama variabel atau fungsi (untuk menghindari serangan injeksi), maka tanda kutip tidak memberikan disambiguasi. Kita sudah tahu bahwa semua data adalah string. Jadi, tolong, tinggalkan tanda kutip sudah, kecuali mereka benar-benar diperlukan.

0
David Spector

Saya menemukan masalah ini dalam proyek saya saat ini karena saya memiliki sedikit JSON yang memerlukan beberapa komentar agar hal-hal mudah diingat.

Saya telah menggunakan fungsi python sederhana ini untuk mengganti komentar & menggunakan json.loads untuk mengubahnya menjadi dict:

import json, re

def parse_json(data_string):
  result = []
  for line in data_string.split("\n"):
    line = line.strip()
    if len(line) < 1 or line[0:2] == "//":
      continue
    if line[-1] not in "\,\"\'":
      line = re.sub("\/\/.*?$", "", line)
    result.append(line)
  return json.loads("\n".join(result))

print(parse_json("""
{
  // This is a comment
  "name": "value" // so is this
  // "name": "value"
  // the above line gets removed
}
"""))
0
LogicalBranch