Haruskah JSON menyertakan nilai null [ditutup]

89

Saya membuat API yang mengembalikan hasil sebagai JSON. Apakah ada praktik terbaik saat ini tentang apakah kita harus menyertakan kunci dalam hasil jika nilainya null? Sebagai contoh:

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

atau

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

Karena yang kedua lebih kecil, saya cenderung ke gaya ini, tetapi saya tidak yakin apakah ada gaya yang disukai atau tidak. Dari perspektif klien, sepertinya kedua gaya tersebut akan secara fungsional setara. Ada pro atau kontra untuk masing-masing?

jjathman.dll
sumber
6
Tidak mungkin menjawab ini dengan benar. Jawaban yang benar tergantung pada persyaratan aplikasi. OP hanya memilih jawaban yang sesuai dengan kebutuhannya. Jika aplikasi Anda perlu membedakan antara mengetahui apakah "isbn" adalah null vs jika "isbn" mungkin tidak dikirim dari server karena alasan lain, Anda perlu memasukkannya.
Jay
@Jacob Meskipun saya tidak mengatakannya, maksud saya dengan pertanyaan ini adalah agar JSON "penuh" yang mewakili tanggapan dikembalikan. Ketika klien dapat berasumsi bahwa tampaknya tidak ada perbedaan fungsional antara kedua pendekatan tersebut. Jika API secara selektif tidak mengembalikan kunci / nilai maka ya itu akan membuat perbedaan besar pendekatan mana yang diambil.
jjathman
manfaat dari representasi pertama adalah bahwa skema objek dipertahankan, keberadaan properti tidak ambigu berdasarkan data. dalam format kedua informasi ini hilang. Spesifikasi JSON tidak mengharuskan kedua format AFAIK
Surya Pratap

Jawaban:

32

Yang kedua akan menghemat sedikit bandwidth, tetapi jika itu menjadi perhatian Anda juga akan menggunakan array yang diindeks daripada mengisi JSON dengan kunci. Jelas, ["Foo Bar","Joe Blow"]jauh lebih singkat dari yang Anda miliki sekarang.

Dalam hal kegunaan, saya rasa tidak ada bedanya. Dalam kedua kasus, if(json.isbn)akan melompat ke else. Biasanya tidak perlu membedakan antara null(tidak ada nilai) dan undefined(tidak ada nilai yang diberikan).

Niet the Dark Absol
sumber
7
+1 untuk Biasanya tidak perlu membedakan antara null (tidak ada nilai) dan tidak terdefinisi (tidak ada nilai yang diberikan). Bahkan ada operator yang berguna untuk itu != null(dimaksudkan tidak ketat)
Esailija
Satu-satunya kasus yang dapat saya pikirkan adalah menguji apakah browser mendukung jenis acara tertentu. Misalnya, if( typeof onbeforepaste == "undefined")untuk melihat apakah onBeforePastedidukung. Meskipun demikian, tidak ada bedanya karena Anda dapat menetapkan acara semau Anda (mereka tidak akan melakukan apa pun jika tidak didukung).
Niet the Dark Absol
6
Dalam hal menghemat byte yang ditransfer, kompresi jauh lebih penting daripada hal-hal seperti array yang diindeks. web-resource-optimization.blogspot.no/2011/06/… Pastikan itu adalah hal pertama yang Anda lakukan. Dalam kebanyakan kasus, menambahkan hal-hal seperti array yang diindeks di atas itulah yang saya sebut pengoptimalan prematur. Kecuali jika Anda mengirim data dalam jumlah BESAR. Itu juga membutuhkan penguraian tambahan, menambahkan lebih banyak kerumitan ke aplikasi Anda. Gzipping dilakukan dengan mulus oleh browser. (dengan asumsi klien adalah browser)
Martin Hansen
3
Dengan HTTPS menjadi norma hari ini (setidaknya untuk aplikasi dengan basis pengguna besar), kompresi berlaku untuk lemparan. Lihat en.wikipedia.org/wiki/CRIME_%28security_exploit%29
Gaurav Vaish
6
Saya benar-benar akan -1 ini untuk "Biasanya tidak perlu membedakan antara nol" jika saya memiliki reputasi. Dari 2 alasan: 1. alasan untuk membedakan ada dan tidak jarang 2. Praktik terbaik adalah selalu memiliki nilai "terdefinisi dengan baik" yang berarti selalu mencegah ambiguitas - 2 makna dari 1 nilai selalu jahat - harus cukup jelas ..
Srneczek
80

Saya penggemar selalu menyertakan null secara eksplisit karena itu membawa makna. Sementara menghilangkan properti meninggalkan ambiguitas.

Selama protokol Anda dengan server disetujui, semua hal di atas dapat berfungsi, tetapi jika Anda mengirimkan null dari server, saya yakin itu akan membuat API Anda lebih fleksibel nanti.

Juga harus disebutkan bahwa fungsi hasOwnProperty javascript memberi Anda wawasan lebih lanjut.

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )
rushkeldon
sumber
3
Tepatnya, lebih banyak orang perlu memahami perbedaan antara "", null, dan undefined. Jawaban atas pertanyaan ini tergantung pada kebutuhan pengguna.
Jay
13
+1. Orang di ujung sana (yang menulis kode) akan lebih baik dilayani oleh nilai-nilai eksplisit. Mereka mungkin tidak menulis JavaScript ;-)
Steve11235
2
Perhatikan bahwa pemeriksaan terhadap null tidak berfungsi dengan ==, === diperlukan (karena tidak ditentukan == null)!
Tommy
tepatnya bagian pertama dari jawaban yang diterima sangat salah ...
Srneczek
Saya akan menulis "propertyName" in objectFromJSONsebagai gantinya objectFromJSON.hasOwnProperty("propertyName"). Juga, jika Anda bersikeras menggunakan hasOwnPropertymaka tulislah Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")untuk keamanan.
Aadit M Shah
22

Dalam JavaScript, nullartinya sesuatu yang sangat berbeda dari undefined.

Keluaran JSON Anda harus mencerminkan apa yang digunakan dan dibutuhkan oleh aplikasi Anda dalam konteks spesifik penggunaan data JSON.

Brad
sumber
5
Tidak ada "tidak terdefinisi" di JSON, jadi saya pikir dia hanya bertanya apakah akan menyertakan properti "kosong" atau tidak - {"prop":undefined}berbeda dari {}.
Bergi
Setuju, saya mencoba menjelaskan bahwa di pihak penerima, jika dia mencari properti tertentu untuk disetel ke nol, itu tidak akan terjadi. Ini akan menjadi tidak terdefinisi, jika ditinggalkan.
Brad
11

Anda pasti harus memasukkannya jika ada kebutuhan untuk membedakan antara nulldan undefinedkarena keduanya memiliki dua arti yang berbeda dalam Javascript. Anda dapat menganggap nullproperti itu tidak diketahui atau tidak berarti, dan undefinedsebagai makna properti itu tidak ada.

Di sisi lain, jika tidak ada orang yang perlu membuat perbedaan itu, lanjutkan saja dan tinggalkan.

Paul
sumber
0

Saya rasa tidak ada bedanya jika Anda menggunakan JSON sebagai data di balik pengalaman pengguna.

Perbedaannya muncul di file JSON-config, ketika pengguna harus mengedit sesuatu dengan tangan. Saat Anda menggunakan contoh pertama, Anda memberi pengguna beberapa petunjuk tentang konfigurasi.

Alexey Kachalov
sumber
1
Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit lebih banyak penjelasan tentang solusi yang Anda berikan?
abarisone