Struktur JSON apa yang digunakan untuk pasangan nilai kunci?

23

Format JSON apa yang merupakan pilihan yang lebih baik untuk pasangan nilai kunci dan mengapa?

[{"key1": "value1"}, {"key2": "value2"}]

Atau:

[{"Name": "key1", "Value": "value1"}, {"Name": "key2", "Value": "value2"}]

Atau:

{"key1": "value1", "key2": "value2"}

Varian pertama tampaknya lebih kompak dan lebih "bermakna secara semantik". Varian kedua tampaknya lebih terstruktur yang mungkin membantu memprosesnya. Varian ke-3 tampaknya lebih semantik.

Pasangan nilai kunci akan digunakan untuk melampirkan data acak ke beberapa item lainnya. Data harus diserialisasi sebagai JSON untuk membulatkannya melalui sistem.

boot4life
sumber
3
Kecuali Anda perlu memesan, mengapa tidak mempertimbangkan {"key1": "value1", "key2": "value2"}?
kennytm
4
JSON sudah menjadi kamus (nestable).
Kasey Speakman
1
Masalah Anda adalah uraian yang cukup luas untuk mengatakan bahwa salah satu format itu akan berfungsi, dan pertanyaan sebenarnya adalah bagaimana membuatnya lebih mudah untuk dikonsumsi, yang tergantung pada teknologi apa yang digunakan klien.
scriptin
Anda harus menggunakan yang paling sederhana yang memenuhi kebutuhan Anda, mudah-mudahan itu akan menjadi bentuk objek sederhana (# 3). Namun, jika Anda mencari lebih banyak opsi, Anda dapat menggunakan dua array secara paralel, satu untuk kunci, dan satu untuk nilai; yang akan sekompak mungkin sambil tetap mendukung kunci objek & duplikat kunci (yang tidak akan didukung dengan # 3).
Erik Eidt

Jawaban:

10

Apakah Anda memilih opsi pertama atau ketiga tergantung pada use case Anda. Jika Anda memodelkan banyak contoh berbeda dari jenis benda yang sama, pilih yang pertama. Misalnya, Anda memiliki daftar orang. Jika Anda memodelkan banyak atribut berbeda dari satu hal, pilih yang ketiga. Anda dapat memiliki kunci berulang dalam format pertama, tetapi tidak dalam format ketiga.

Opsi kedua mengerikan, dan saya belum menemukan use case yang sesuai untuk itu. Alasannya mengerikan, selain lebih bertele-tele, adalah untuk JSON satu tingkat, ini memecah konversi otomatis sebagian besar perpustakaan ke kamus / peta. Untuk JSON yang sangat bersarang, ia merusak antarmuka permintaan seperti XPath .

Ini membuatnya sulit untuk diajak bekerja sama. Dan jika Anda tidak tahu kunci Anda pada waktu kompilasi, Anda akan menginginkan kamus atau antarmuka XPath, karena Anda tidak akan dapat mengubahnya menjadi sebuah kelas. Ini mungkin tidak tampak seperti masalah besar sekarang, tetapi semakin lama Anda memiliki format data, semakin sulit untuk berubah.

Karl Bielefeldt
sumber
5
Keuntungan besar dari opsi kedua adalah ia bekerja dengan kunci non-string, khususnya kunci komposit.
CodesInChaos
1
Opsi kedua mengerikan dan Anda belum menemukan use case? Array kamus dengan banyak pasangan kunci / nilai harus mengenai format yang paling umum untuk mentransmisikan banyak objek.
gnasher729
2
@ gnasher729, dalam kasus "paling format umum" Anda kunci nyata semua di sisi kiri: [{"key1": "value1", "key2": "value2"}]. Format kedua di sini adalah meletakkan kunci nyata di sisi kanan, dan menggunakan kunci lain yang disebut "Nama" untuk mengarahkan Anda ke kunci nyata, sehingga sangat sulit untuk mengurai dengan alat standar.
Karl Bielefeldt
Saya akan memberi Anda yang itu, @CodesInChaos. Bahkan di sana, itu harus menjadi kasus yang sangat istimewa. Saya belum pernah melihat kebutuhan untuk itu di alam liar.
Karl Bielefeldt
3
Maaf, tapi ini jawaban yang buruk. Opsi ke-2 sangat umum digunakan dan disarankan. Ini memungkinkan fleksibilitas tombol, memungkinkan ekstensi (dengan lebih banyak nilai / bidang metadata) tanpa melanggar konsumen, dan dapat mempertahankan urutan elemen. Plus, alasan yang diberikan adalah palsu: itu tidak merusak "konversi otomatis" (itu hanya menghormati presentasi penulis sebagai array) dan berfungsi baik dengan antarmuka permintaan seperti XPath. Satu-satunya downside adalah peningkatan verbositas.
Hejazzman
5

Format ke-3 secara umum adalah yang terbaik. Namun, berikut adalah contoh dari sesuatu yang cocok untuk format pertama:

[{
  "username": "foo",
  "id": 1
}, {
  "username": "bar",
  "id": 2
}, {
  "username": "baz",
  "id": 3
}]

Di sini setiap objek merujuk ke hal yang terpisah (dan setiap objek menggunakan kunci yang sama dengan yang lain, sehingga mereka tidak dapat digabung). Namun, setiap objek dalam daftar disimpan { "username": "foo", "id": 1 }bukan [{ "username": "foo" }, { "id": 1 }]karena 1) lebih pendek dan 2) merujuk pada satu hal dengan nama pengguna dan id, bukan satu hal dengan nama pengguna dan hal lain dengan id.

Masalah dengan opsi kedua adalah bahwa itu menjadi sangat bertele-tele baik sebagai JSON dan untuk bekerja dengannya. Namun, ini dapat digunakan jika Anda perlu menyimpan meta-informasi tentang properti. Sebuah contoh:

{
  "key": "foo",
  "value": 1,
  "mutable": true
}

Di sini mutablemerujuk pada kasus hipotetis apakah Anda dapat memodifikasi properti itu sendiri, bukan objek induknya. Meta-informasi seperti ini mirip dengan JavaScript Object.defineProperty, yang menyimpan informasi "dapat dikonfigurasi", "enumerable", dan "dapat ditulis" tentang properti.

gcampbell
sumber
Saya mencoba menggunakan format pertama untuk beberapa JSON yang saya kirim ke titik akhir C # REST dan itu tidak mengkonversi ke objek kamus. Mengubahnya ke format ke-3 membersihkannya.
fizch
5

Anda mengatakan ini adalah pasangan kunci / nilai. Dalam hal itu, gunakan # 3: kamus pasangan kunci / nilai.

Jika ini bukan pasangan kunci / nilai, maka jangan menyebutnya "kunci" dan "nilai" dan gunakan # 2, array kamus dengan konten yang berubah-ubah.

Struktur # 1 hanya gila kecuali Anda membutuhkan pasangan kunci / nilai tetapi juga pesanan mereka. Yang jarang kamu lakukan.

gnasher729
sumber
3

Tempatkan diri Anda pada posisi orang yang menerima json. Jika saya tidak tahu nama kuncinya, bagaimana saya bisa mengambilnya dengan format pertama atau terakhir? Anda dapat mengulang melalui json tentu saja tetapi karena ketiga format mencapai hasil yang sama itu hanya masalah sintaksis. Saya pikir ini adalah satu-satunya pertanyaan yang bermakna: jika Anda tahu nama-nama kunci pilihan pertama atau terakhir lebih kompak, jika bukan pilihan kedua lebih dimengerti.

JoulinRouge
sumber