JSON null değerler içermeli [kapalı]


89

Sonuçları JSON olarak döndüren bir API oluşturuyorum. Değer null olduğunda sonuca anahtarları dahil edip etmememiz gerektiğine dair mevcut bir en iyi uygulama var mı? Örneğin:

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

veya

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

İkincisi daha küçük olduğu için bu stile yöneliyorum ama tercih edilen bir stil olup olmadığından emin değilim. Müşteri açısından bakıldığında, her iki stilin de işlevsel olarak eşdeğer olacağı görülmektedir. Her birinin artıları veya eksileri var mı?


6
Buna doğru cevap vermek imkansız. Doğru cevap, uygulamanın gereksinimlerine bağlıdır. OP, kendi gereksinimlerine uyan cevabı seçmiştir. Başvurunuzun "isbn" nin boş olup olmadığını bilmekle "isbn" sunucudan başka bir nedenle gönderilmemiş olup olmadığını ayırt edebilmesi gerekiyorsa, bunu eklemeniz gerekir.
Jay

@Jacob Söylememiş olsam da, bu soruyla ilgili niyetim yanıtı temsil eden "dolu" JSON'un geri verilmesi idi. Bir müşteri, iki yaklaşım arasında işlevsel bir fark olmadığını varsayabildiğinde. API seçici olarak anahtarları / değerleri döndürmezse, evet, hangi yaklaşımın izlendiği büyük bir fark yaratır.
jjathman

ilk temsilin yararı, nesne şemasının korunmasıdır, özelliğin varlığı verilere dayalı olarak belirsiz değildir. ikinci formatta bu bilgi kaybolur. JSON spesifikasyonu, AFAIK formatlarını zorunlu kılmaz
Surya Pratap

Sanırım bu soru hakkında hiçbir fikriniz yok. JSON bir standarttır. Bunun için bir şartname ve muhtemelen bir grup RFC olmalı. // Bunun da ötesinde, fikir içeren sorular bile kabul edilebilir. Meta.stackexchange üzerinde daha önce bununla ilgili tartışmalar olmuş ve burada "en iyi uygulamaları" paylaşma açısından düşünülen soruların iyi olduğuna karar vermişlerdi.
bvdb

Yanıtlar:


32

İkincisi, bant genişliğinden az miktarda tasarruf sağlayacaktır, ancak bu bir sorun olsaydı, JSON'u anahtarlarla doldurmak yerine dizinlenmiş dizileri de kullanırdın. Açıkçası, ["Foo Bar","Joe Blow"]şu anda sahip olduğunuzdan çok daha kısa.

Kullanılabilirlik açısından bir fark yarattığını düşünmüyorum. Her iki durumda if(json.isbn)da else. Genellikle null(değer yok) ve undefined(verilen değer yok ) arasında ayrım yapmaya gerek yoktur.


7
+1 for Genellikle null (değer yok) ve undefined (verilen değer yok) arasında ayrım yapmaya gerek yoktur. Bunun için kullanışlı bir operatör bile var != null(katı olmayan amaçlarla)
Esailija

Aklıma gelen tek durum, bir tarayıcının belirli bir olay türünü destekleyip desteklemediğini test etmek olabilir. Örneğin , desteklenip desteklenmediğini if( typeof onbeforepaste == "undefined")görmek için onBeforePaste. O zaman bile, olayları istediğiniz kadar atayabileceğiniz için gerçek bir fark yaratmaz (desteklenmezlerse hiçbir şey yapmazlar).
Niet the Dark Absol

6
Aktarılan baytların kaydedilmesi açısından sıkıştırma, dizinlenmiş diziler gibi şeylerden çok daha önemlidir. web-resource-optimization.blogspot.no/2011/06/… Yaptığınız ilk şeyin bu olduğundan emin olun. Çoğu durumda, bunun üzerine dizinlenmiş diziler gibi şeyler eklemek, erken optimizasyon dediğim şeydir. BÜYÜK miktarda veri göndermediğiniz sürece. Bu ayrıca, uygulamanıza daha fazla karmaşıklık katan ek ayrıştırma gerektirir. Gzip, tarayıcı tarafından sorunsuz bir şekilde yapılır. (istemcinin bir tarayıcı olduğunu varsayarak)
Martin Hansen

3
HTTPS'nin günün normu haline gelmesiyle (en azından büyük kullanıcı tabanına sahip uygulamalar için), sıkıştırma bir fırsata dönüşür. Bkz en.wikipedia.org/wiki/CRIME_%28security_exploit%29
Gaurav Vaish

6
Eğer bir şöhrete sahipsem, "genellikle boş olanı ayırt etmeye gerek yoktur" için bunu -1 olurdum. 2 nedenden dolayı: 1. ayırt etmek için nedenler vardır ve bunlar nadir değildir 2. en iyi uygulama, her zaman belirsizliklerin her zaman önlenmesi anlamına gelen "iyi tanımlanmış" değerlere sahip olmaktır - 1 değerin 2 anlamı her zaman kötüdür - oldukça açık olmalıdır ..
Srneczek

80

Anlam taşıdığı için her zaman açıkça null eklemenin hayranıyım. Bir mülkün ihmal edilmesi belirsizlik bırakır.

Sunucuyla olan protokolünüz üzerinde anlaşmaya varıldığı sürece, yukarıdakilerden herhangi biri işe yarayabilir, ancak sunucudan boş değerler geçerseniz, API'lerinizi daha sonra daha esnek hale getireceğine inanıyorum.

Ayrıca javascript'in hasOwnProperty işlevinin size daha fazla fikir verdiğini de belirtmelisiniz.

/* 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 )

3
Tam olarak, daha fazla insanın "", boş ve tanımsız arasındaki farkı anlaması gerekir. Bu sorunun cevabı, kullanıcı gereksinimlerine bağlıdır.
Jay

13
+1. Diğer uçtaki kişiye (kodu yazan) açık değerler daha iyi hizmet görecektir. JavaScript yazmıyor olabilirler ;-)
Steve11235

2
Null değerine karşı denetlemenin ==, === ile çalışmadığını unutmayın (çünkü tanımsız == null)!
Tommy

kabul edilen cevabın tam olarak ilk kısmı çok yanlış ...
Srneczek

Onun "propertyName" in objectFromJSONyerine yazardım objectFromJSON.hasOwnProperty("propertyName"). Eğer kullanmakta ısrar Ayrıca, hasOwnPropertydaha sonra yazma Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")güvenliği için.
Aadit M Şah

22

JavaScript'te, nullçok farklı bir şey ifade eder undefined.

JSON çıktınız, JSON verilerini kullanma bağlamında uygulamanız tarafından kullanılan ve ihtiyaç duyulanları yansıtmalıdır.


5
JSON'da "tanımsız" yoktur, bu yüzden sadece "boş" özelliklerin dahil edilip edilmeyeceğini sorduğunu düşünüyorum - {"prop":undefined}farklıdır {}.
Bergi

Kabul ediyorum, alıcı tarafta, boş olarak ayarlanacak belirli bir özellik arıyorsa, olmayacağını açıklamaya çalışıyorum. Dışarıda bırakılırsa tanımsız olacaktır.
Brad

11

Javascript'te iki farklı anlama sahip olduğundan nullve aralarında ayrım yapmaya ihtiyaç varsa kesinlikle eklemelisiniz undefined. nullMülkün bilinmeyen veya anlamsız olduğu ve undefinedmülkün var olmadığı anlam olarak düşünebilirsiniz .

Öte yandan, kimsenin bu ayrımı yapmasına gerek yoksa, devam edin ve bırakın.


0

JSON'u kullanıcı deneyiminin arkasındaki bir veri olarak kullandığınızda hiçbir fark olmadığını düşünüyorum.

Fark, bir kullanıcının bir şeyi elle düzenlemesi gerektiğinde JSON-config dosyalarında görünür. İlk örneği kullandığınızda, kullanıcıya yapılandırma hakkında bazı ipuçları vermiş olursunuz.


1
Sağladığınız çözüm hakkında biraz daha açıklama ekleyerek yanıtınızı biraz daha detaylandırır mısınız?
abarisone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.