JSON'da bir set nasıl temsil edilir?


16

JSON şu veri yapılarını (Java eşdeğerleri) destekler: Skaler, Dizi / Liste ve Harita.

JSON'da A Set, kutudan çıkar çıkmaz desteklenmez.

JSON'da bir seti temsil etmenin birkaç yolunu düşündüm:

[1] - Liste olarak

Ancak, liste, kendi sıralamayı vardır aşağıdaki iki liste böylece, ["a", "b"]ve ["b", "a"]listeleri gibi eşit değildir, ancak bunlar batarken eşit olmalıdır.

[2] - Harita olarak

Haritanın anahtar kümesini kullanın ve değerleri yok sayın.

Ancak yine, standart karşılaştırmayı kullanarak, ikisi haritalarla aynı değildir:

{"a": "foo", "b": "bar"}, {"a": null, "b": null}

[3] - Harita olarak, özel bir değere sahip

Bir skaler alın, söyleyin 0veya nullharitadaki her anahtarın değeri olmaya zorlayın:

{"a": 0, "b": 0}

Bu şekilde, standart karşılaştırma araçları altında, anahtar sırası değişse bile nesneler eşittir.

Ancak, bu teknik JSON belgesini ilgisiz verilerle kirletir.

[4] - Sıralı bir liste olarak

İlk öneriye, ancak bu sefer sıralı bir liste olarak geri dönün. Bu tür karşılaştırma sorununu çözer.

Bununla birlikte, sıralamanın karmaşıklığını ve aynı zamanda sıralama gösterimi yinelenenleri işlerken, sıralı bir liste yapmaz. Misal:

{"a": 400, "a": 9}olarak ele alınır {"a": 9}, ancak ["g", "g"]her zaman olur ["g", "g"].

Tüm bunları söyledikten sonra, liste gösteriminin daha net olduğu anlaşılıyor, ancak harita gösterimi tuşların çoğaltılması için daha sağlam ve özel değer hakkında tutarlı olmasını zorlaştırıyor ( nullbunun için iyi bir seçim gibi görünse de).

Ne düşünüyorsun? JSON'da bir seti nasıl temsil edersiniz?

PS

Bu sorunun sadece JSON ile ilgili olduğunu unutmayın. Yaml gibi başka formatların da mevcut olduğunu biliyorum. Hala ...


1
Setler JSON tarafından desteklenmiyor, kapsam dışında. Uygulama kapsamında bir küme veya farklı, benzersiz bir koleksiyon vardır. Bu bir koleksiyon olduğu için koleksiyon sözdizimini kullanmak daha açık olur.
Zymus

1
Neden JSON'da kümeleri temsil etmek istersiniz? Unutmayın JSON bir değişim biçimidir.
Andres F.

@AndresF. Değerlerin teklik özelliğini ifade etmenin iyi bir fikir olacağını düşündüm. JSON'u sadece takas formatına bağlamam. Ayrıca belge depolama için de yararlı olabilir (MongoDB'de olduğu gibi).
Ron Klein

@RonKlein Fuarı yeterince. Ama ugh ... beni MongoDB ile başlatma: P
Andres F.

YAML'de, setler seçenek [3] olarak temsil edilir, ancak JSON'un sahip olmadığı özel bir gösterimi vardır.
Jasmijn

Yanıtlar:


21

Pekala, yapamazsın. Dediğiniz gibi, dizileri ve sözlükleri temsil edebilirsiniz. İki seçeneğiniz var.

Kümeyi dizi olarak temsil eder. Avantajı: Setten diziye ve geriye dönüş yapmak genellikle kolaydır. Dezavantajı: Bir dizinin, bir kümenin içermediği zımni bir sırası vardır, bu nedenle aynı kümeleri JSON dizilerine dönüştürmek, farklı kabul edilecek diziler oluşturabilir. Dizi öğelerinin benzersiz olduğunu zorlamanın bir yolu yoktur, bu nedenle bir JSON dizisi geçerli bir küme içermeyebilir (açıkçası kopyaları yok sayabilirsiniz; yine de olması muhtemeldir).

Kümeyi, anahtar başına rastgele bir değerle (örneğin 0 veya null) sözlük olarak temsil edin. Değerleri görmezden gelirseniz, bu mükemmel bir eşleşmedir. Öte yandan, bir sözlüğün tuşlarını küme olarak çıkarmak veya bir kümeyi sözlüğe dönüştürmek için kütüphane desteğiniz olmayabilir.

Programlama ortamımda, set ve dizi arasındaki dönüşüm daha kolaydır (set için dizi, orada olmamalı veya doğru olarak düşünülecek yinelenen değerleri kaybedecektir), bu nedenle dizilerle giderdim. Ancak bu bir görüş meselesi.

AMA: Odada daha önce bahsedilmemiş büyük bir şişman fil var. JSON sözlüğündeki anahtarlar yalnızca dize olabilir. Kümeniz dizeler kümesi değilse, yalnızca dizi kullanma seçeneğiniz vardır.


5
string olmayan kenar durumu sözlüğe karşı iyi bir argüman.
Ron Klein

4

JSON'da kümeleri temsil etmeye çalışmayın. Bunun yerine verileri ayrıştırırken yapın.

JSON verilerinizde, hangi alanların küme olarak ele alınması gerektiğini belirten bir şema olmalıdır veya bir listenin ne zaman küme (örn. {"houses": {"_type": "set", "value": [...]}}) Veya adlandırma kuralıyla ele alınması gerektiğini açıklayan JSON verilerine gömülü bir meta veri olabilir .

JSON standardına göre, bir JSON nesnesinin yinelenen anahtarları olabileceğini unutmayın. ECMA-404 ifadeleri:

Nesneler

[...] JSON sözdizimi, ad olarak kullanılan dizelere herhangi bir kısıtlama getirmez, ad dizelerinin benzersiz olmasını gerektirmez ve ad / değer çiftlerinin sıralamasına herhangi bir önem vermez. Bunların tümü, JSON işlemcileri tarafından veya veri alışverişi için JSON'un belirli kullanımlarını tanımlayan özelliklerde tanımlanabilecek anlamsal değerlendirmelerdir.

AFAICD, spesifikasyondaki hiçbir şey benzersiz olmayan isimleri yasaklamaz ve benzersiz olmayan nesne adlarını ayrıştırabilen birçok JSON ayrıştırıcı uygulaması vardır. RFC 7159, birlikte çalışabilirlik için benzersiz olmayan adların kullanılmasını engeller, ancak özellikle bunu da yasaklamaz ve benzersiz olmayan nesne adlarını işlerken çeşitli ayrıştırıcıların nasıl görüldüğünü listeler.

ECMA 404 ayrıca dizi sırasının korunmasını gerektirmez:

Diziler

JSON sözdizimi, değerlerin sıralaması için özel bir anlam tanımlamaz. Ancak, JSON dizi yapısı genellikle siparişle ilgili bazı anlambilimlerin olduğu durumlarda kullanılır.

Bu ifade, uygulamaların, istedikleri takdirde kümeleri temsil etmek için dizileri kullanmasına izin verir.

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.