Saat membuat objek atau array JSON secara manual, seringkali lebih mudah untuk meninggalkan koma pada item terakhir di objek atau array. Sebagai contoh, kode untuk menghasilkan dari array string mungkin terlihat seperti (dalam kode p ++ seperti C ++):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
memberi Anda string seperti
[0,1,2,3,4,5,]
Apakah ini diizinkan?
alert([1, 2, 3, ].length)
akan menampilkan "4".Jawaban:
Sayangnya spesifikasi JSON tidak memungkinkan tanda koma. Ada beberapa browser yang memungkinkan, tetapi umumnya Anda perlu khawatir tentang semua browser.
Secara umum saya mencoba membalikkan masalah, dan menambahkan koma sebelum nilai aktual, sehingga Anda berakhir dengan kode yang terlihat seperti ini:
Satu baris kode tambahan di dalam for loop Anda tidak mahal ...
Alternatif lain yang saya gunakan ketika menampilkan struktur ke JSON dari kamus dari beberapa bentuk adalah selalu menambahkan koma setelah setiap entri (seperti yang Anda lakukan di atas) dan kemudian menambahkan entri boneka di akhir yang belum tertinggal koma (tetapi itu hanya malas; ->).
Sayangnya, tidak berfungsi dengan baik pada array.
sumber
if
hanya untuk menghindari koma kecil yang bodoh itu. Tentang YMMV yang cepat, lihat ini misalnya jsfiddle.net/oriadam/mywL9384 Klarifikasi: Solusi Anda hebat, saya hanya benci spesifikasi yang melarang koma tertinggal.Tidak. Spesifikasi JSON, seperti yang dipertahankan di http://json.org , tidak mengizinkan tanda koma. Dari apa yang saya lihat, beberapa parser diam-diam memungkinkan mereka ketika membaca string JSON, sementara yang lain akan melempar kesalahan. Untuk interoperabilitas, Anda tidak harus memasukkannya.
Kode di atas dapat direstrukturisasi, baik untuk menghilangkan koma trailing saat menambahkan terminator array atau untuk menambahkan koma sebelum item, melewatkan itu untuk yang pertama.
sumber
Sederhana, murah, mudah dibaca, dan selalu berfungsi terlepas dari spesifikasi.
Tugas berlebihan untuk $ delim adalah harga yang sangat kecil untuk dibayar. Juga berfungsi dengan baik jika tidak ada loop eksplisit tetapi fragmen kode terpisah.
sumber
if
lebih mudah dipahami. Tapi terima kasih sudah berbagi.for(let ..., sep=""; ... ; sep=",") { ...
Tanda koma diizinkan dalam JavaScript, tetapi tidak berfungsi di IE. Spek JSON tanpa versi Douglas Crockford tidak mengizinkannya, dan karena itu bukan versi, ini seharusnya tidak berubah. ES5 JSON spec memungkinkan mereka sebagai perpanjangan, tetapi Crockford's RFC 4627 tidak, dan ES5 kembali untuk melarang mereka. Firefox mengikutinya. Internet Explorer adalah alasan mengapa kita tidak dapat memiliki hal-hal yang baik.
sumber
Seperti yang sudah dikatakan, spec JSON (berdasarkan ECMAScript 3) tidak mengizinkan trailing koma. ES> = 5 memungkinkannya, jadi Anda benar-benar dapat menggunakan notasi itu di JS murni. Sudah berdebat tentang, dan beberapa parser tidak mendukungnya ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- tidak lagi diterima / ), tetapi itu adalah fakta khusus (seperti yang ditunjukkan pada http://json.org/ ) yang seharusnya tidak berfungsi di JSON. Hal itu mengatakan ...
... Aku bertanya-tanya mengapa tidak ada menunjukkan bahwa Anda benar-benar dapat membagi loop di iterasi 0 dan penggunaan terkemuka koma bukannya tertinggal satu untuk menyingkirkan bau kode perbandingan dan overhead kinerja aktual dalam lingkaran, sehingga kode yang sebenarnya lebih pendek, lebih sederhana dan lebih cepat (karena tidak ada percabangan / kondisional dalam loop) daripada solusi lain yang diajukan.
Misalnya (dalam pseudocode C-style mirip dengan kode yang diusulkan OP):
sumber
Coders PHP mungkin ingin memeriksa implode () . Ini membutuhkan array yang bergabung menggunakan string.
Dari dokumen ...
sumber
Menariknya, baik C & C ++ (dan saya pikir C #, tapi saya tidak yakin) secara khusus memungkinkan koma tertinggal - untuk alasan yang diberikan: Ini membuat daftar program yang diprogram jauh lebih mudah. Tidak yakin mengapa JavaScript tidak mengikuti jejak mereka.
sumber
Gunakan JSON5. Jangan gunakan JSON.
http://json5.org/
https://github.com/aseemk/json5
sumber
Ada cara yang mungkin untuk menghindari if-branch dalam loop.
sumber
Menurut spesifikasi Kelas JSONArray :
Jadi, seperti yang saya pahami, seharusnya diperbolehkan menulis:
Tetapi bisa terjadi bahwa beberapa parser akan mengembalikan 7 sebagai jumlah item (seperti IE8 seperti yang ditunjukkan Daniel Earwicker) bukannya 6 yang diharapkan.
Diedit:
Saya menemukan Validator JSON ini yang memvalidasi string JSON terhadap RFC 4627 (Jenis media aplikasi / json untuk Notasi Objek JavaScript) dan terhadap spesifikasi bahasa JavaScript. Sebenarnya di sini array dengan tanda koma dianggap sah hanya untuk JavaScript dan bukan untuk spesifikasi RFC 4627.
Namun, dalam spesifikasi RFC 4627 dinyatakan bahwa:
Bagi saya ini lagi-lagi masalah interpretasi. Jika Anda menulis bahwa Elemen dipisahkan oleh koma (tanpa menyatakan sesuatu tentang kasus khusus, seperti elemen terakhir), itu dapat dipahami dengan dua cara.
PS RFC 4627 bukan standar (seperti yang dinyatakan secara eksplisit), dan sudah usang oleh RFC 7159 (yang merupakan standar yang diusulkan) RFC 7159
sumber
value-separator
tanpavalue
hak sebelahnya. Juga teksnya sangat spesifik. "Pemisahan nilai" hanya dapat berlaku jika ada beberapa nilai. Jadi, jika Anda memiliki dua nilai di samping satu sama lain, mereka dipisahkan menggunakan koma. Jika Anda memiliki satu nilai (atau jika Anda hanya melihat nilai di bagian akhir), tidak ada pemisahan, maka tidak ada koma.Dari pengalaman saya sebelumnya, saya menemukan bahwa browser yang berbeda berurusan dengan trailing koma di JSON secara berbeda.
Baik Firefox dan Chrome menanganinya dengan baik. Tapi IE (Semua versi) tampaknya rusak. Maksud saya benar-benar istirahat dan berhenti membaca sisa naskah.
Mengingat hal itu, dan juga fakta bahwa selalu baik untuk menulis kode yang sesuai, saya sarankan menghabiskan upaya ekstra untuk memastikan bahwa tidak ada tanda koma.
:)
sumber
Saya menyimpan hitungan saat ini dan membandingkannya dengan jumlah total. Jika jumlah saat ini kurang dari jumlah total, saya menampilkan koma.
Mungkin tidak berfungsi jika Anda tidak memiliki jumlah total sebelum mengeksekusi generasi JSON.
Kemudian lagi, jika Anda menggunakan PHP 5.2.0 atau lebih baik, Anda bisa memformat respons Anda menggunakan API JSON bawaan.
sumber
Dengan JSON Santai, Anda dapat memiliki tanda koma, atau biarkan saja koma keluar . Mereka adalah opsional.
Tidak ada alasan sama sekali koma perlu hadir untuk mem-parsing dokumen seperti JSON.
Lihatlah spec JSON Santai dan Anda akan melihat betapa 'berisik' spesifikasi JSON aslinya. Terlalu banyak koma dan kutipan ...
http://www.relaxedjson.org
Anda juga dapat mencoba contoh Anda menggunakan parser RJSON online ini dan melihatnya diurai dengan benar.
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
sumber
json object
menggunakanJSON.parse
, atau oleh perpustakaan menggunakanRJSON.parse
. Saya akan setuju dengan Anda jika sumbernya adalah objek, tapi bukan itu masalahnya. Saya tidak melihat di mana dalam pertanyaan itu disebutkandownstream
sama sekali memakan objek atau string.Saya biasanya mengulang array dan melampirkan koma setelah setiap entri dalam string. Setelah loop saya menghapus koma terakhir lagi.
Mungkin bukan cara terbaik, tapi lebih murah daripada memeriksa setiap kali apakah itu objek terakhir dalam loop kurasa.
sumber
Tidak disarankan, tetapi Anda masih bisa melakukan hal seperti ini untuk menguraikannya.
sumber
Karena for-loop digunakan untuk melakukan iterate pada array, atau struktur data iterable yang serupa, kita dapat menggunakan panjang array seperti yang ditunjukkan,
Dengan datafile.txt berisi,
sumber
Sebagaimana dinyatakan itu tidak diizinkan. Namun dalam JavaScript ini adalah:
(berfungsi dengan baik di Firefox, Chrome, Edge, IE11, dan tanpa izin di IE9, 8, 7, 5)
sumber