Anahtar değer çiftleri için hangi JSON yapısı kullanılacak?


23

Hangi JSON formatı, anahtar değer çiftleri için daha iyi bir seçimdir ve neden?

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

Veya:

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

Veya:

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

İlk değişken daha kompakt ve daha "anlamsal olarak anlamlı" görünüyor. İkinci değişken daha dengeli bir şekilde yapılandırılmış görünüyor ve bu da onu işlemeye yardımcı olabilir. 3. değişken daha anlamsal görünüyor.

Anahtar değer çiftleri, başka bir öğeye rasgele veri eklemek için kullanılacaktır. Verilerin bir sistemde yuvarlaklaştırılması için JSON olarak serileştirilmesi gerekir.


3
Sipariş vermek istemiyorsanız neden düşünmeyin {"key1": "value1", "key2": "value2"}?
kennytm

4
JSON zaten bir (nestable) sözlüktür.
Kasey Speakman

1
Sorununuz, tanımlamanın, bu biçimlerden herhangi birinin çalışacağını söyleyecek kadar geniştir ve asıl soru, müşterilerin hangi teknolojileri kullandığına bağlı olarak tüketmeyi nasıl daha basit hale getireceğidir.
scriptin

İhtiyaçlarınızı karşılayan en basitini kullanmalısınız, umarım bu basit nesne formu olacaktır (# 3). Bununla birlikte, daha fazla seçenek arıyorsanız, iki diziyi paralel, biri anahtarlar, diğeri de değerler için kullanabilirsiniz; nesne tuşlarını ve yinelenen tuşları (# 3 ile desteklenmeyecek şekilde) desteklerken, mümkün olduğu kadar küçük olacaktır.
Erik Eidt

Yanıtlar:


10

Birinci mi yoksa üçüncü seçeneği mi seçeceğiniz, kullanım durumunuza göre değişir. Aynı türden birçok farklı örneği modelliyorsanız, ilkini seçin. Örneğin, bir insan listeniz var. Bir şeyin birçok farklı özelliğini modelliyorsanız, üçüncüyü seçin. Tuşları birinci formatta tekrarlamış olabilirsiniz, ancak üçüncü sırada değilsiniz.

İkinci seçenek korkunç ve bunun için uygun bir kullanım örneği bulamadım. Daha ayrıntılı olmasının yanı sıra, korkunç olmasının nedeni, tek seviyeli JSON için çoğu kütüphanenin bir sözlüğe / haritaya otomatik dönüşümünü bölmesidir. Derinden iç içe geçmiş JSON için, XPath benzeri sorgu arabirimini keser .

Bu çalışmak için bir acı yapar. Anahtarlarınızı derleme zamanında bilmiyorsanız, bir sözlük veya XPath arabirimi isteyeceksiniz, çünkü onu bir sınıfa dönüştüremezsiniz. Şimdi önemli bir şey gibi görünmeyebilir, ancak bir veri formatınız ne kadar uzun olursa, o kadar zorlaşır.


5
İkinci seçeneğin en büyük avantajı, dize olmayan tuşlarla, özellikle de bileşik tuşlarla çalışmasıdır.
CodesInChaos

1
İkinci seçenek korkunç ve henüz bir kullanım davası bulamadınız mı? Çok sayıda anahtar / değer çiftine sahip sözlükler dizisi, birden fazla nesneyi iletmek için en yaygın biçim hakkında olmalıdır.
gnasher729

2
@ gnasher729, sizin "en yaygın biçimi" durumunda gerçek tuşları sol tarafında tüm şunlardır: [{"key1": "value1", "key2": "value2"}]. Buradaki ikinci format, gerçek anahtarı sağ tarafa koyuyor ve sizi “gerçek anahtar” a işaret etmek için “Ad” adı verilen başka bir anahtar kullanarak standart araçlarla ayrıştırmayı son derece zorlaştırıyor.
Karl Bielefeldt

Bunu sana vereceğim, @CodesInChaos. Orada bile olsa çok özel bir durum olmalı. Vahşi doğada buna hiç ihtiyaç duymadım.
Karl Bielefeldt

3
Üzgünüm, ama bu kötü bir cevap. İkinci seçenek hem çok yaygın kullanılır hem de tavsiye edilir. Anahtarların esnekliğini sağlar, tüketicileri bozmadan genişletmeye (daha fazla değer / meta veri alanı olan) izin verir ve eleman sırasını koruyabilir. Ayrıca, verilen nedenler sahtedir: herhangi bir "otomatik dönüşümü" bozmaz (yalnızca yazarın dizisini sunmasına saygı duyar) ve XPath benzeri bir sorgu arabirimiyle iyi çalışır. Tek dezavantajı artan ayrıntıda.
Hejazzman

5

3. format genel olarak en iyisidir. Ancak, işte birinci format için uygun olan bir şey:

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

Burada her nesne ayrı bir şeye atıfta bulunur (ve her nesne diğerleriyle aynı anahtarları kullanır, böylece birleştirilemezler). Bununla birlikte, listede her bir nesne olarak saklanır { "username": "foo", "id": 1 }yerine [{ "username": "foo" }, { "id": 1 }]çünkü: 1) daha kısa ve 2) bir kullanıcı ve bir kimlik değil, bir kullanıcı adı olan şey ve bir kimliğe sahip başka bir şey ile bir şey atıfta bulunuyor.

İkinci seçenekle ilgili sorun, hem JSON hem de birlikte çalışabilmesi için çok ayrıntılı hale gelmesidir. Bununla birlikte, özellik hakkında meta bilgi kaydetmeniz gerekiyorsa kullanılabilir. Bir örnek:

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

Burada mutable, ana nesneyi değil, mülkü kendisinin değiştirip değiştiremeyeceğinin varsayımsal bir örneğine atıfta bulunulmaktadır. Bunun gibi meta bilgileri Object.defineProperty, bir özellik hakkındaki "yapılandırılabilir", "numaralandırılabilir" ve "yazılabilir" bilgileri depolayan JavaScript'lere benzer .


Bazı JSON için bir C # REST bitiş noktasına gönderdiğim bazı formatları kullanmaya çalışıyordum ve bir sözlük nesnesine dönüşmüyordu. 3. biçime dönüştürmek bunu temizledi.
fizch

5

Bunların anahtar / değer çiftleri olduğunu söylüyorsunuz. Bu durumda, # 3: anahtar / değer çiftleri sözlüğünü kullanın.

Bunlar ise değil anahtar / değer çiftleri, ardından "tuşları" ve "değerler" diyoruz ve 2., keyfi içerikli sözlükler dizisini kullanmayın.

Yapı # 1, anahtar / değer çiftlerine ihtiyaç duymadığınız sürece ancak aynı zamanda siparişleri gerektirmediğinde de karmaşıktır. Hangi nadiren yaparsın.


3

Kendini jsonu alan kişinin ayakkabılarına koy. Anahtar adını bilmiyorsam, ilk ya da son formatla nasıl alacağım? Tabii ki json'da dolaşabilirsiniz ancak üç format da aynı sonucu aldığından bu sadece bir sözdizimi sorunudur. Bunun tek anlamlı soru olduğunu düşünüyorum: Anahtar adlarını biliyorsanız, ilk veya son seçenek daha kompakt, ikinci seçenek daha anlaşılır değilse.

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.