JSON ve XML karşılaştırması [kapalı]


273

Hangisinin daha hızlı olduğunu bilmek istiyorum: XML ve JSON? Hangisi ne zaman kullanılır?


60
Daha hızlı nerede? Bulaşma? İşleme? Yaratma? Her ikisinin de bildiğin ayağı yok. JSON'un daha az biçimlendirme yükü olduğundan bir şekilde "daha hızlı" olması muhtemeldir. Diğer taraftan XML, türlerin, yapının ... geçerliliğini sağlamak için XMLSchema sağlar. XML'i hemen hemen her çıktı biçiminde dönüştürmek için XSLT var ... İhtiyacınız olan şeye bağlı .
Felix Kling

2
Ayrıca daha önce sorulan diğer soruları da kontrol edin: stackoverflow.com/search?q=json+vs+xml
Felix Kling

16
Blarg! Bu gerçekten bilmek istediğim bir şeydi ve burada olduğu için çok memnun oldu ve cevaplar MÜKEMMEL. SİZİN İÇİN KÖTÜ , se moderatörler: belki de nişan alma sürenizi uzatma zamanı. En azından cevaplanmasına izin verdiğin için sana iyi!
Mark Gerolimatos

Bu yazının oyuna çok geç kalması umrumda değil, ama katılıyorum. Bir soru bir dupe, alakasız veya hizmet şartlarıyla çelişiyorsa, belki de (kapalı / yararsız iplik) bir aramada ortaya çıkan ilk şey olmamalıdır. (btw, bu ortaya çıkan 2. [duped] sonuç) Belki de cevapların yalın ve özlü olması gerektiğine katılıyorum, ancak sonuçtan sonra sonuç kapalı, cevaplanmamış bir konu ise konu dışı yorumlar (kullanım koşullarına karşı) kimseye yardım etmez.
Izaac Corbett

2
Sorulduğu gibi soru belirsiz olsa da, bu görüşe dayalı bir soru DEĞİLDİR.
qwr

Yanıtlar:


221

Hangisini ne zaman kullanacağınızı cevaplamadan önce, biraz arka plan:

edit: Bu karşılaştırma gerçekten onları JavaScript ile bir tarayıcıda kullanma açısından olduğunu belirtmek gerekir. Ya veri formatı yol değil sahiptir kullanılacak ve ben oldukça geçerli dediğimi yapmak ayrıntıları değişecek iyi ayrıştırıcıları bol vardır.

JSON hem daha kompakt hem de (benim görüşüme göre) daha okunabilir - iletimde daha az veri aktarıldığından "daha hızlı" olabilir.

Ayrıştırma işleminde ayrıştırıcıya bağlıdır. Kodu (JSON veya XML olsun) bir veri yapısına (harita gibi) dönüştüren bir ayrıştırıcı, XML'in katı niteliğinden yararlanabilir ( XML Şemaları veri yapısını güzel bir şekilde belirsizleştirir) - ancak JSON'da bir öğenin türü (Dize / Number / Nested JSON Object) sözdizimsel olarak çıkarılabilir, örn:

myJSON = {"age" : 12,
          "name" : "Danielle"}

Ayrıştırıcının, 12bir sayıyı temsil eden (ve Daniellediğerleri gibi bir dize olduğunu) fark edecek kadar zeki olmasına gerek yoktur . Javascript'te şunları yapabiliriz:

anObject = JSON.parse(myJSON);
anObject.age === 12 // True
anObject.name == "Danielle" // True
anObject.age === "12" // False

XML'de aşağıdaki gibi bir şey yapmamız gerekir:

<person>
    <age>12</age>
    <name>Danielle</name>
</person>

(bir kenara, bu XML'in daha ayrıntılı olduğu noktasını göstermektedir; veri iletimi için bir endişe). Bu verileri kullanmak için, bir ayrıştırıcı aracılığıyla çalıştırırdık, ardından şöyle bir şey çağırmamız gerekir:

myObject = parseThatXMLPlease();
thePeople = myObject.getChildren("person");
thePerson = thePeople[0];
thePerson.getChildren("name")[0].value() == "Danielle" // True
thePerson.getChildren("age")[0].value() == "12" // True

Aslında, iyi bir ayrıştırıcı agesizin için iyi bir şekilde yazabilir (öte yandan, bunu yapmak istemeyebilirsiniz). Bu verilere eriştiğimizde, yukarıdaki JSON örneğinde olduğu gibi bir özellik araması yapmak yerine, anahtarda bir harita araması yapıyoruz name. XML'i şu şekilde oluşturmak daha sezgisel olabilir:

<person name="Danielle" age="12" />

Ancak yine de verilerimize erişmek için harita aramaları yapmak zorundayız:

myObject = parseThatXMLPlease();
age = myObject.getChildren("person")[0].getAttr("age");

EDIT: Orijinal:

Çoğu programlama dilinde (hepsi değil, herhangi bir streç ile), bunun gibi bir harita araması bir özellik aramasından daha maliyetli olacaktır (JSON'i ayrıştırdığımızda yukarıda bulduğumuz gibi).

Bu yanıltıcıdır: JavaScript'te (ve diğer dinamik dillerde) harita araması ile alan araması arasında bir fark olmadığını unutmayın . Aslında, bir saha araması olan sadece bir harita arama.

Gerçekten değerli bir karşılaştırma yapmak istiyorsanız, en iyisi bunu karşılaştırmaktır - verileri kullanmayı planladığınız bağlamda karşılaştırmaları yapın.

Yazarken, Felix Kling bunları her birini ne zaman kullanacakları ile karşılaştırarak oldukça kısa ve öz bir cevap verdi, bu yüzden daha fazla devam etmeyeceğim.


Sadece bilgiçliksel bir not ... Bir JavaScript alanı araması mutlaka bir harita araması değildir. Söz konusu nesneye ve alana bağlıdır. Küçük nesneler (özellikle inşaattan sonra özellikleri bağlı olmayanlar) genellikle modern JS motorlarında satır içi önbelleklerle optimize edilmiş "hızlı türler" kullanır ve çok sayıda özelliğe sahip nesneler için daha yavaş özellik torbalarına (harita aramaları) geri döner veya nesne yapısının sık sık değiştiği durumlar.
Brandon Paddock

2
JSON'un insanlar için ayrıştırılmasını, XML'in bilgisayarları ayrıştırmasını daha kolay buluyorum.
Jus12

5
Doğru değil, örneğin PHP'de JSON, 78k'de bağımlılık olmadan json.so kullanır, diğer yandan XML, 54k / 32k'de xml.so veya xmlreader.so'ya ihtiyaç duyar, ancak aynı zamanda libxml2.so gerektirir . Daha fazla kodun işlenmesi ve daha fazla bellek kullanılması daha uzun sürer. Bahsetmemek gerekirse, XML, düğümleri / ağaç yapısı nedeniyle, zayıf referansları olmayan herhangi bir dilde acı olabilecek dairesel referanslara sahiptir. Birkaç dilde XML ayrıştırıcısının kendi muadili JSON ayrıştırıcılarından daha büyük (daha fazla bellek alır ve daha fazla bellek kullanır) olduğunu fark ettim.
Rahly

JS katı durum sorununu bu alakasız karşılaştırmaya neden karıştırıyorsunuz? Çift veya üçlü eşit işaretlere atıfta bulunulması.
atilkan

1
@atilkan çünkü birçok ayrıştırıcı sayısal dizgileri sayı olarak yorumlar ya da sayıları sayısal dizeler olarak saklar.
mazunki

244

Daha hızlı bir JSON veya XML özniteliği ya da bunlar arasında bir karşılaştırma yapılması sonucu değildir. Varsa, ayrıştırıcıların veya verileri ilettiğiniz bant genişliğinin bir özelliğidir.

JSON ve XML'in avantaj ve dezavantajlarının bir listesi (başlangıcı):


JSON

Pro:

  • XML ile karşılaştırıldığında daha az "biçimlendirme" ek yükü ile sonuçlanan basit sözdizimi.
  • Biçimlendirme, JS nesnesi değişmez gösteriminin bir alt kümesidir ve JavaScript ile aynı temel veri türlerine sahip olduğundan, JavaScript ile kullanımı kolaydır.
  • Açıklama ve veri tipi ve yapı doğrulaması için JSON Şeması
  • Derin iç içe yapılarda bilgi çıkarmak için JsonPath

con:

  • Basit sözdizimi, yalnızca birkaç farklı veri türü desteklenir.

  • Yorumlar için destek yok.


XML

Pro:

  • Genelleştirilmiş işaretleme; her türlü amaç için "lehçeler" oluşturmak mümkündür
  • Veri tipi için XML Şeması , yapı doğrulaması. Yeni veri türleri oluşturmayı da mümkün kılar
  • Farklı çıktı formatlarına dönüşüm için XSLT
  • Derin yuvalanmış yapılarda bilgi çıkarmak için XPath / XQuery
  • ad alanları için yerleşik destek

con:

  • JSON ile karşılaştırıldığında göreceli olarak garip (aynı miktarda bilgi için daha fazla veri sağlar).

Sonuçta neye ihtiyacınız olduğuna karar vermelisiniz . Her iki formatın da meşru kullanım durumları olduğu açıktır. Çoğunlukla JavaScript kullanacaksanız JSON ile gitmelisiniz.

Artılarını ve eksilerini eklemekten çekinmeyin. Ben bir XML uzmanı değilim;)


20
JSON için başka bir Con ve XML için Pro: JSON nesne referansını desteklemez (döngüsel veya değil), XML destekler. XML bunu idözniteliği belge içinde benzersiz olmaya zorlayarak yapar .
Dünya Motoru

7
@EarthEngine Aslında Json.Net ( json.codeplex.com ) nesne referanslarını destekliyor: james.newtonking.com/projects/json/help/index.html?topic=html/… .
Dmitrii Lobanov

22
@DmitryLobanov: JSON standardına bazı ek kısıtlamalar ekliyorlar, ancak diğer JSON araçları tarafından tanınmıyor. Yani JSON için "yerli" değil. Ancak XML için kısıtlama standart olarak yazılır, böylece yereldir.
Earth Engine

1

5
JSON, "null" değerinin yanı sıra dahili dizilere de sahiptir. XML'de ise şema ayrıştırıcılarınızda bir tür kurala ihtiyacınız vardır. JSON için XSLT benzeri dönüşüm projeleri de var (örn. Github.com/emlynoregan/bOTLjs )
Vasyl Boroviak

22

İşlem hızı sadece ilgili mesele olmayabilir, ancak asıl soru şu: Bir kıyaslamadaki bazı sayılar: JSON vs. XML: Ayrıntılarla ilgili bazı zor sayılar . Hız için, bu basit karşılaştırmada XML, JSON'a göre% 21'lik bir ek yük sunar.

Makalenin dediği gibi ayrıntılarla ilgili önemli bir not, en yaygın şikayet: bu uygulamada çok ilgili değil (ne XML ne de JSON verileri genellikle insanlar tarafından değil, makineler tarafından işlenir), hız, sıkıştırmak için biraz daha fazla zaman gerektirir.

Ayrıca, bu karşılaştırmada büyük miktarda veri işlendi ve tipik bir web uygulaması 90 MB gibi büyüklükteki veri yığınlarını iletmeyecek ve sıkıştırma yararlı olmayabilir (yeterince küçük veri parçaları için sıkıştırılmış bir yığın) sıkıştırılmamış yığından daha büyük olacaktır), bu yüzden uygulanamaz.

Yine de, herhangi bir sıkıştırma söz konusu değilse, JSON, açıkça tersine olduğu gibi, özellikle klasik HTTP ek yükünün yokluğunun JSON'un avantajı üzerinde fark yaratabileceği bir WebSocket bağlantısı üzerinden iletilirse, iletim kanalı üzerinde daha az ağırlık alacaktır. önemli.

Aktarımdan sonra veriler tüketilir ve bu toplam işlem süresinde sayılır. Yeterince büyük veya karmaşık veri iletilecekse, doğrulayan bir XML ayrıştırıcısı tarafından otomatik olarak denetlenen bir şemanın olmaması, JSON verileri üzerinde daha fazla denetim gerektirebilir; bu denetimlerin özellikle hızlı olduğu bilinmeyen JavaScript'te yürütülmesi gerekir ve bu nedenle bu gibi durumlarda XML üzerinde ek bir ek yük oluşturabilir.

Her neyse, sadece test sizin özel kullanım durumunuzun cevabını sağlayacaktır (hız gerçekten standartsa, güvenlik veya bütünlük değilse…).

Güncelleme 1: bahsetmeye değer, Gzip kullanmaktan daha az maliyetle sıkıştırma sunan ve sıkıştırılmış XML'nin sıkıştırmasını açmak için gerekli olan işlemi kaydeten ikili XML formatı EXI'dir. EXI XML, BSON JSON için ne olduğunu. Burada hem uzay hem de zaman açısından verimliliğe atıfta bulunarak hızlı bir genel bakış var: EXI: Son ikili standart? .

Güncelleme 2: Verimlilik ve düşük bellek ve CPU ayak izi olarak W3C tarafından yürütülen bir ikili XML performans raporları da var, XML alanı için de bir sorun var: Verimli XML Değişim Değerlendirmesi .

Güncelleme 2015-03-01

HTTP yükü bir sorun olarak ortaya çıktığı için bu bağlamda fark edilmeye değer: IANA, EXI kodlamasını (yukarıda belirtilen verimli ikili XML) aa HTTP protokolü için bir İçerik Kodlaması olarak kaydetti ( sıkıştırma , söndürme ve gzip ile birlikte ) . Bu, EXI'nin tarayıcılar tarafından muhtemelen diğer HTTP istemcileri arasında anlaşılması beklenen bir seçenek olduğu anlamına gelir. Bkz. Köprü Metni Aktarım Protokolü Parametreleri (iana.org) .


"Hız için, bu basit karşılaştırmada XML, JSON'a göre% 21 ek yük sunar" - kullanılan belirli ayrıştırıcıya bağlı olarak JSON ayrıştırmada büyük bir fark vardır. Herhangi bir ayrıştırıcıyı alıntılamak neredeyse anlamsızdır. XML için de aynı.
Jeffrey Blattman

17

Bu makaleyi dijital pazarda gerçekten ilginç buldum . Alıntılarını Norm'dan alıntılamak:

JSON pros hakkında:

Etmek istediğiniz tek şey atomik değerler veya atomik değerlerin listeleri veya karmalarıysa, JSON, XML'in birçok avantajına sahiptir: İnternet üzerinden doğrudan kullanılabilir, çok çeşitli uygulamaları destekler, JSON'u işlemek için programlar yazmak kolaydır, isteğe bağlı birkaç özelliği vardır, insan tarafından okunabilir ve makul derecede açıktır, tasarımı resmi ve özlüdür, JSON belgelerinin oluşturulması kolaydır ve Unicode kullanır. ...

XML artıları hakkında:

XML, yapılandırılmamış verilerin tam zenginliği ile oldukça iyi ilgilenir. Ölümü neşeyle web API tasarımcılarının bir kadrosu tarafından kutlansa bile XML'in geleceği hakkında endişelenmiyorum.

Ve "Sana söylemiştim!" masamda bir token. Ben daha zengin API geliştirmek istendiğinde JSON millet ne yaptığını görmek için sabırsızlanıyoruz. Daha az iyi yapılandırılmış veri alışverişi yapmak istediklerinde, JSON'a çekecekler mi? JSON için zaman zaman bir şema dilinden bahsediyorum, diğer diller takip edecek mi? ...

Şahsen Norm'a katılıyorum. XML'e yapılan saldırıların çoğunun, gerçekten entegrasyon geliştiricilerinden değil, tipik uygulamalar için Web Geliştiricileri'nden geldiğini düşünüyorum. Ama bu benim görüşüm! ;)


İyi koy! Aktif geliştiricilerin% 80'i javascript kiddies ise,% 80'i JSON'un "daha iyi" olduğu görüşünü söyleyecektir. Ancak yazılan dilleri kullanan herkes JSON hakkında biraz eğlendiriliyor. { "foo": 42 }Bu nesne ne tür? Ardından, tip eksikliği gidermek için, bu gösteri up gibi şeyler: { "__type": "Bar", "foo": 42 }. Kontrast tip XML elemanı ismine connotated edilebilir: <Bar><foo>42</foo></Bar>. Sadece lisp ve json gibi javascript çocuklar;)
BitTickler

15

XML (genişletilebilir İşaretleme Dili) genellikle XHR kullanılır, çünkü bu standart bir yayın dili, herhangi bir programlama dili tarafından kullanılabilen ve hem sunucu hem de istemci tarafını desteklediğinden, bu en esnek çözümdür. XML daha fazla bölüm için ayrılabilir, böylece belirli bir grup diğer bölümleri etkilemeden programın bir bölümünü geliştirebilir. XML formatı XML DTD veya XML Şeması (XSL) tarafından da belirlenebilir ve test edilebilir.

JSON, JavaScript uygulamalarının olası biçimi olarak daha popüler hale gelen bir veri alışverişi biçimidir. Temelde bu bir nesne gösterim dizisidir. JSON çok basit bir sözdizimine sahiptir, bu yüzden kolayca öğrenilebilir. Ayrıca JavaScript, JSON evalişleviyle ayrıştırmayı destekler . Öte yandan, evalişlevin olumsuzlukları vardır. Örneğin, program çok yavaş JSON ayrıştırma evalolabilir ve güvenlik nedeniyle çok riskli olabilir. Bu JSON'un iyi olmadığı anlamına gelmez, sadece daha dikkatli olmalıyız.

Benim önerim, JSON'u oyunlar gibi hafif veri alışverişi olan uygulamalar için kullanmanızdır. Veri işlemeyi gerçekten önemsemeniz gerekmediğinden, bu çok basit ve hızlıdır.

XML, alışveriş siteleri veya bunun gibi daha büyük web siteleri için en iyisidir. XML daha güvenli ve açık olabilir. Düzeltmeyi kolayca test etmek ve kolayca parçalara ayırmak için temel veri yapısı ve şema oluşturabilirsiniz.

Hız ve güvenlik nedeniyle XML kullanmanızı öneririz, ancak hafif şeyler için JSON.


Ben küçümseme değilim ama JSON'un genel olarak daha ağır bir yük veya daha yavaş olduğunu nasıl gördüğünüzü merak ediyorum. GZip / Deflate uygulanabilir. Sözdizimi doğal olarak bayt açısından daha küçük yapar. JSON ayrıca şemasını bir sözleşme olarak tanımlayabilir ve bu şekilde kolayca serileştirilebilir.
Anthony Mason

JSON'un ayrıştırılması için değerlendirilmesine gerek yoktur.
Yay295

7

JSON ile ilgili önemli olan şey, güvenlik nedeniyle veri aktarımını şifreli tutmaktır. Şüphesiz JSON, XML'den çok daha hızlıdır. XML 100ms almak gördüm nerede JSON sadece 60ms aldı. JSON verilerinin kullanımı kolaydır.


5
Katılıyorum, JSON veri aktarımı savaşını kazanıyor, ancak öğelerin işaretlenmesi, doğrulanması ve genişletilmesi konusunda eksik. Google'ın sitemap.xml değil sitemap.json
sürünmesinin

1
Site Haritası json popüler olmadan önce tanımlandı, bu en iyi örnek değil. Site Haritası, XML'in JSON'dan daha popüler olduğu bir sunucudan sunucuya da görülür. (JSON gerçekten sadece popüler olduğu için JavaScript'te çalışmak kolay olduğu için.)
Matthew Whited

ancak Google AMP, xml değil json kullanıyor
Ashraf
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.