Perbezaan Antara YAML dan JSON

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan melihat perbezaan antara YAML dan JSON melalui contoh cepat dan praktikal.

2. Format

Untuk mempunyai imej yang lebih baik, mari kita mulakan dengan melihat gambaran JSON dan YAML POJO ringkas:

class Person { String name; Integer age; List hobbies; Person manager; }

Pertama, mari lihat perwakilan JSONnya:

{ "name":"John Smith", "age":26, "hobbies":[ "sports", "cooking" ], "manager":{ "name":"Jon Doe", "age":45, "hobbies":[ "fishing" ], "manager":null } }

Sintaks JSON agak membebankan kerana menggunakan sintaks khas seperti pendakap kerinting {} dan kurungan persegi [] untuk mewakili objek dan tatasusunan.

Seterusnya, mari kita lihat bagaimana struktur yang sama akan kelihatan di YAML:

name: John Smith age: 26 hobbies: - sports - cooking manager: name: Jon Doe age: 45 hobbies: - fishing manager:

Sintaks YAML kelihatan sedikit lebih mesra kerana menggunakan ruang kosong untuk menunjukkan hubungan antara objek dan ' - ' untuk mewakili elemen array.

Kita dapat melihat bahawa walaupun kedua-duanya mudah dibaca, YAML cenderung lebih mudah dibaca oleh manusia.

Titik bonus lain untuk YAML adalah bilangan baris yang diperlukan untuk mewakili maklumat yang sama - YAML hanya mengambil 11 baris, sementara JSON mengambil 16.

3. Saiz

Kami telah melihat di bahagian sebelumnya bahawa YAML diwakili dalam baris yang lebih sedikit daripada JSON, tetapi adakah itu bermaksud bahawa ia memerlukan lebih sedikit ruang?

Mari kita bayangkan struktur yang sangat bersarang dengan ibu bapa dan lima anak yang diwakili sebagai JSON:

{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":null } } } } } } }

Struktur yang sama kelihatan serupa di YAML:

child: child: child: child: child: child: child:

Pada pandangan pertama, nampaknya JSON memerlukan lebih banyak ruang, tetapi, pada kenyataannya, spesifikasi JSON tidak peduli dengan ruang kosong atau barisan baru, dan dapat dipendekkan seperti berikut:

{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}

Kita dapat melihat bahawa bentuk kedua jauh lebih pendek, dan hanya menempati 74 bait, sementara format YAML mengambil 97 bait.

4. Ciri-ciri YAML

Selain ciri asas yang disediakan oleh JSON, YAML dilengkapi dengan fungsi tambahan seperti yang akan kita lihat seterusnya.

4.1. Komen

YAML membenarkan komen dengan menggunakan # , ciri yang sering diinginkan ketika bekerja dengan fail JSON:

# This is a simple comment name: John

4.2. Rentetan Berbilang Garis

Ciri lain yang tiada di JSON tetapi terdapat dalam YAML ialah rentetan pelbagai baris:

website: | line1 line2 line3

4.3. Alias ​​dan Jangkar

Kita boleh dengan mudah menetapkan alias untuk item tertentu dengan menggunakan & dan menahan (rujukan) dengan menggunakan * :

httpPort: 80 httpsPort: &httpsPort 443 defaultPort: *httpsPort

5. Persembahan

Kerana sifat spesifikasi JSON yang sederhana, kinerjanya dalam menguraikan / membuat siri data jauh lebih baik daripada YAML.

Kami akan melaksanakan penanda aras mudah untuk membandingkan kelajuan penghuraian YAML dan JSON menggunakan JMH.

Untuk penanda aras YAML, kami akan menggunakan perpustakaan snake-yaml yang terkenal , dan untuk penanda aras JSON kami, kami akan menggunakan org-json :

@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Measurement(batchSize = 10_000, iterations = 5) @Warmup(batchSize = 10_000, iterations = 5) @State(Scope.Thread) class Bench { static void main(String[] args) { org.openjdk.jmh.Main.main(args); } @State(Scope.Thread) static class YamlState { public Yaml yaml = new Yaml(); } @Benchmark Object benchmarkYaml(YamlState yamlState) { return yamlState.yaml.load("foo: bar"); } @Benchmark Object benchmarkJson(Blackhole blackhole) { return new JSONObject("{\"foo\": \"bar\"}"); } }

Seperti yang kami jangkakan, JSON adalah pemenang, lebih kurang 30 kali lebih cepat:

Benchmark Mode Cnt Score Error Units Main2.benchmarkJson thrpt 50 644.085 ± 9.962 ops/s Main2.benchmarkYaml thrpt 50 20.351 ± 0.312 ops/s

6. Ketersediaan Perpustakaan

JavaScript adalah standard untuk web, yang bermaksud bahawa hampir mustahil untuk mencari bahasa yang tidak menyokong sepenuhnya JSON.

Sebaliknya, YAML disokong secara meluas, tetapi bukan standard. Ini bermaksud perpustakaan ada untuk bahasa pengaturcaraan yang paling popular, tetapi kerana kerumitannya, mereka mungkin tidak sepenuhnya melaksanakan spesifikasi.

7. Apa yang Perlu Saya Pilih?

Ini mungkin soalan sukar untuk dijawab dan subjektif dalam banyak kes.

Sekiranya kita perlu mendedahkan sekumpulan API REST ke aplikasi front-end atau back-end lain, kita mungkin harus menggunakan JSON kerana ini adalah standard industri de facto.

Sekiranya kita perlu membuat fail konfigurasi yang sering dibaca / dikemas kini oleh manusia, YAML mungkin merupakan pilihan yang baik.

Sudah tentu, ada juga kes penggunaan di mana YAML dan JSON sangat sesuai, dan itu hanya masalah selera.

8. Kesimpulannya

Dalam artikel ringkas ini, kami telah mengetahui perbezaan utama antara YAML dan JSON dan aspek apa yang perlu dipertimbangkan untuk membuat keputusan yang tepat mengenai mana yang harus kami pilih.