1. 概述
在本文檔中,我們將通過快速且實用的示例,探討 YAML 和 JSON 之間的差異。
2. 格式
為了獲得更好的圖像,我們首先來看 JSON 和 YAML 中一個簡單 POJO 的表示:
class Person {
String name;
Integer age;
List<String> hobbies;
Person manager;
}首先,我們來看一下它的JSON表示:
{
"name":"John Smith",
"age":26,
"hobbies":[
"sports",
"cooking"
],
"manager":{
"name":"Jon Doe",
"age":45,
"hobbies":[
"fishing"
],
"manager":null
}
}JSON 語法相對繁瑣,因為它使用特殊語法,如花括號 {} 和方括號 [] 來表示對象和數組。
接下來,讓我們看看同樣的結構在 YAML 中會是什麼樣:
name: John Smith
age: 26
hobbies:
- sports
- cooking
manager:
name: Jon Doe
age: 45
hobbies:
- fishing
manager:YAML 的語法看起來更友好,因為它使用空格來表示對象之間的關係,並且使用 ‘–’ 來表示數組元素。
我們可以看到,雖然兩者都易於閲讀,但 YAML 傾向於更易於人類閲讀。
YAML 另一個優勢是它表示相同信息的行數——YAML 只需要 11 行,而 JSON 需要 16 行。
3. 尺寸
我們之前已經看到,YAML 的行數比 JSON 少,但這是否意味着它佔用空間更少?
讓我們設想一個深度嵌套的結構,包含一個父級節點和五個子節點,以 JSON 表示如下:
{
"child":{
"child":{
"child":{
"child":{
"child":{
"child":{
"child":null
}
}
}
}
}
}
}相同的結構在 YAML 中也會看起來相似:
child:
child:
child:
child:
child:
child:
child:第一眼看上去,JSON 可能會顯得佔用更多空間,但實際上,JSON 規範不關心空格或換行符,並且可以像下面這樣縮短:
{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}我們能看出,這種第二種形式要短得多,只佔用 74 字節,而 YAML 格式則佔用 97 字節。
4. YAML 特性
除了 JSON 提供的基本功能之外,YAML 還具有額外的功能,如下一節所述。
4.1. 註釋
YAML 通過使用 #, 提供註釋功能,這在處理 JSON 文件時經常被需求,是 YAML 的一個常用特性:
# This is a simple comment
name: John4.2. 多行字符串
YAML 中缺少但 JSON 中存在的一種特性是多行字符串:
website: |
line1
line2
line34.3. 別名和錨點
我們可以使用 & 輕鬆地為特定項目分配別名,並使用 * 進行錨定(引用)。
httpPort: 80
httpsPort: &httpsPort 443
defaultPort: *httpsPort5. 性能
由於 JSON 規範的簡潔性,其解析/序列化數據的性能優於 YAML。
我們將實施一個簡單的基準測試,使用 JMH 比較 YAML 和 JSON 的解析速度。
對於 YAML 基準測試,我們將使用知名庫 snake-yaml,對於 JSON 基準測試,我們將使用 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\"}");
}
}正如我們所預料的,JSON 是獲勝者,速度比它快約 30 倍:
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/s6. 庫可用性
JavaScript 是 Web 上的標準語言,這意味着幾乎找不到不支持 JSON 的語言。
另一方面,YAML 得到廣泛支持,但它並非標準語言。這意味着對於大多數流行的編程語言,存在相應的庫,但由於其複雜性,這些庫可能無法完全實現規範。
7. 選擇哪種格式?
這個問題可能很難回答,而且在很多情況下也具有主觀性。
如果我們需要向其他前端或後端應用程序暴露一組 REST API,我們應該選擇 JSON,因為它在行業中是事實上的標準。
如果我們需要創建一個經常由人類讀取/更新的配置文件,YAML 可能是個不錯的選擇。
當然,也可能存在一些用例,其中 YAML 和 JSON 都能很好地發揮作用,這隻取決於個人喜好。
8. 結論
在本文中,我們學習了 YAML 和 JSON 之間的主要區別,以及在做出明智決策時應考慮的方面,選擇哪一種格式。