1. 概要

この簡単な記事では、簡単で実用的な例を通して、YAMLとJSONの違いを見ていきます。

2. フォーマット

より良い画像を得るには、単純なPOJOのJSONおよびYAML表現を確認することから始めましょう。

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のもう1つのボーナスポイントは、同じ情報を表すのに必要な行数です。YAMLは11行しかかかりませんが、JSONは16行かかります。

3. サイズ

前のセクションで、YAMLはJSONよりも少ない行で表されることを確認しましたが、それはそれがより少ないスペースを必要とすることを意味しますか?

親と5つの子が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}}}}}}}

2番目の形式ははるかに短く、占有するのは74バイトだけですが、YAML形式は97バイトを使用していることがわかります。

4. YAML機能

JSONが提供する基本機能に加えて、YAMLには次に説明する追加機能が付属しています。

4.1. コメントコメント

YAMLでは、を使用してコメントを許可します。これは、JSONファイルを操作するときによく必要となる機能です。

# This is a simple comment
name: John

4.2. 複数行の文字列

JSONにはないが、YAMLにはあるもう1つの機能は、複数行の文字列です。

website: |
  line1
  line2
  line3

4.3. エイリアスとアンカー

を使用して、特定のアイテムにエイリアスを簡単に割り当てることができます を使用してアンカー(参照)します *

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

5. パフォーマンス

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/s

6. ライブラリの可用性

JavaScriptはWebの標準です。つまり、JSONを完全にサポートしていない言語を見つけることはほとんど不可能です。

一方、YAMLは広くサポートされていますが、標準ではありません。 つまり、ライブラリは最も一般的なプログラミング言語用に存在しますが、その複雑さのために、仕様を完全に実装していない可能性があります。

7. 何を選べばいいですか?

これは答えるのが難しい質問であり、多くの場合主観的な質問かもしれません。

一連のRESTAPIを他のフロントエンドまたはバックエンドアプリケーションに公開する必要がある場合は、事実上の業界標準であるJSONを使用する必要があります。

人間が頻繁に読み取ったり更新したりする構成ファイルを作成する必要がある場合は、YAMLが適切なオプションになる可能性があります。

もちろん、YAMLとJSONの両方が適しているユースケースもあるかもしれませんが、それは好みの問題です。

8. 結論

この簡単な記事では、YAMLとJSONの主な違いと、どちらを選択すべきかについて情報に基づいた決定を行うために考慮すべき側面について学びました。