YAMLとJSONの違いは何ですか?


735

YAMLとJSONの違いは何ですか、特に次の点を考慮してください。

  • パフォーマンス(エンコード/デコード時間)
  • メモリ消費
  • 表現の明快さ
  • ライブラリの可用性、使いやすさ(私はCを好む)

私は組み込みシステムでこれら2つのうちの1つを使用して構成ファイルを格納することを計画していました。

関連:

Perlデータを格納するためにYAMLまたはJSONを使用する必要がありますか?


26
JSONはYAMLのサブセットと見なすことができることに注意してください:en.wikipedia.org/wiki/JSON#YAML
Charles

2
@チャールズ、はい、しかし微妙な違いがあります:ajaxian.com/archives/json-yaml-its-getting-closer-to-truth
pierrotlefou

1
YAMLは(おおよそ)JSONのスーパーセットであるため、その表現力を使用するかどうかを想定せずにパフォーマンスの問題に答えることはできません。あなたがそれを必要としないなら:YAMLパーサーはJSONを読むのにどのくらい速いですか あなたがそれを必要とする場合:同じアイデアのおそらくより長いJSON表現を可能にする場合、JSONパーサーはどのくらい遅くなりますか?
poolie 2012年

@jokoon私は「Cライブラリを好む」と思います(例libyaml)
dbr

4
YAMLドキュメント複雑で読みにくい場合があります。「10億笑い」攻撃はYAMLで可能です。一方、複雑なオブジェクト、グラフ、その他の構造は、YAMLで効率的にシリアル化できます。交換フォーマットと単純な構造の場合、JSONが推奨されます。複雑なオブジェクトのシリアル化、または文法定義の場合、YAMLが推奨されます。
Erik Aronesty 2016

回答:


656

技術的にはYAMLはJSONのスーパーセットです。つまり、少なくとも理論的には、YAMLパーサーはJSONを理解できますが、必ずしもその逆ではありません。

「YAML:Relation to JSON」というタイトルのセクションの公式仕様を参照してください。

一般的に、JAMLで利用できないYAMLについて私が気に入っている点がいくつかあります。

  • 以下のよう@jdupontが指摘し、YAMLはを見て視覚的に簡単です。実際、YAMLホームページ自体は有効なYAMLですが、人間が読むのは簡単です。
  • YAMLには、「アンカー」を使用してYAMLファイル内の他のアイテムを参照する機能があります。したがって、MySQLデータベースにあるようなリレーショナル情報を処理できます。
  • YAMLは、JSONやXMLなどの他のシリアル化形式をYAMLファイル内に埋め込むことについてより堅牢です。

実際には、これらの最後の2つの点のどちらも、おそらくあなたや私が行うことには重要ではありませんが、長期的には、YAMLはより堅牢で実行可能なデータシリアル化形式になると思います。

現在、AJAXおよびその他のWebテクノロジーはJSONを使用する傾向があります。YAMLは現在、オフラインのデータ処理により多く使用されています。たとえば、CベースのOpenCVコンピュータビジョンパッケージにはデフォルトで含まれていますが、JSONは含まれていません。

JSONとYAMLの両方のCライブラリがあります。YAMLのライブラリは新しいものになる傾向がありますが、以前は問題ありませんでした。たとえばYaml-cppを参照してください。


199
jsonは(近いものの)サブセットではなく、非互換性は、それらを検出したときに激怒します。jsonライブラリは一般的に高速です...(stackoverflow.com/questions/2451732/…)。yamlの支持者は、それがサブセットであると主張します。読みやすさが気になる場合は、yamlを使用してください。相互運用性と速度が問題になる場合は、JSONを使用してください。
Erik Aronesty 2013年

6
YAMLは、特定の形式のJSON構文のスーパーセットです。つまり、YAMLと互換性のある方法でJSONを使用する場合、それは適切なサブセットです。pierrが上記でコメントしたように、仕様は[互換性を目指して](ajaxian.com/archives/json-yaml-its-getting-closer-to-truth)です。
naught101

120
また、YAMLは便利なコメントをサポートしています。
デン

59
@ErikAronesty JSONはYAML 1.1のサブセットに近いものでしたが、YAML 1.2以降は真のサブセットになりました。YAML 1.2は主に、2つの仕様間の最近のいくつかの非互換性を解決するためにリリースされました。
00prometheus

64
YAML 1.2仕様:「この改正の主な目的は、公式のサブセットとしてJSONに準拠さYAMLをもたらすことです。」
リッチC

204

違い:

  1. YAMLは、使用方法によっては、JSONよりも読みやすくなります
  2. 多くの場合、JSONはより高速であり、おそらくより多くのシステムと相互運用できます
  3. 「十分な」JSONパーサーを非常に迅速に作成することが可能
  4. 潜在的に有効なJSON である重複キーは、確実に無効なYAMLです。
  5. YAMLには、コメントやリレーショナルアンカーなど、多くの機能があります。したがって、YAML構文は非常に複雑であり、理解するのが難しい場合があります。
  6. {a: &b [*b]}一部のコンバーターでは無限ループするyaml:で再帰的な構造を書き込むことができます。循環検出を使用しても、「yaml爆弾」は依然として可能です(xml爆弾を参照)。
  7. 参照がないため、JSONでオブジェクト参照を使用して複雑な構造をシリアル化することはできません。したがって、YAMLシリアル化はより効率的です。
  8. 一部のコーディング環境では、YAMLの使用により、攻撃者が任意のコード実行する可能性があります

観察:

  1. レベルを示すために括弧で囲まれた構文ではなくインデントを使用しているため、Pythonプログラマーは一般にYAMLの大ファンです。
  2. 多くのプログラマーは、インデントへの「意味」の付加を悪い選択だと考えています。
  3. データ形式がアプリケーションの環境を離れる場合、UI内で解析される場合、またはメッセージングレイヤーで送信される場合は、JSONの方が適している場合があります。
  4. YAMLは、文法定義などの複雑なタスクに直接使用でき、多くの場合、新しい言語を開発するよりも優れた選択肢です。

9
そうです。Yaml 1.2の目的は、いくつかの互換性の違いを解決してJSONを厳密なサブセットにすることでした。仕様が目的を達成していないと思われる場合は、エリック、YAML仕様に違反している、または検証された1.2準拠のYAMLパーサーに違反している有効なJSONのどこかに例を示してください。
SFEley 2013

32
@SFEley YAML仕様では、無効なYAMLになる可能性のある有効なJSONファイルが存在することが示されています。しかし、実際には使用されない可能性があります。「JSONのRFC4627では、マッピングキーは一意でなければならない(SHOULD)必要がありますが、YAMLではそれらが「必須」であると主張しています。したがって、YAMLは技術的にはJSON仕様に準拠しており、重複をエラーとして扱うことを選択しています。実際には、JSONはそのような重複のセマンティクス。唯一の移植可能なJSONファイルは一意のキーを持つものであり、したがって有効なYAMLファイルです。」- yaml.org/spec/1.2/spec.html#id2759572
デビッド・C.ビショップ

9
インデントの使用についてコメントするには; まあ、私はそれに慣れる必要があるかもしれないと信じ、誰もがそれを望んでいるわけではありません。たとえば、私は.NETの人です。私はtravis.ymlファイルを見ていて、なぜ問題があったのかと思っていました。私はそれがあり得ないところにタブがあったことを知りました。スペース/タブ/改行の設定が原因で爆発することに誰もが慣れているわけではありません。
Phil

10
タブは、インデント文字としてまったく許可されていません。私見、それはすべての言語で優れたコーディングスタイルです-構文インデントの有無にかかわらず。
00prometheus 2015年

6
@Wyrmwood私は個人的にpythonとYAMLが好きで、文字通りそれらを毎日使用しています。私は、ユーザーが頻繁に編集する必要があるものにはYAMLを使用し、「必要がある」可能性があるものにはJSONを使用する傾向があります。私は、インデントが混乱しているC ++開発者から正当な批判を受けました...特に複数のレベルまたはより長い関数ブロックがある場合。もちろん...テスト可能な優れたコードにはそれらがないため、通常は問題になりません。これは私の個人的な見解ですが、カジュアルなGoogle検索では多くの結果が得られます...なので、確認するのは簡単です。
エリックアロンスティ

89

難解な理論を回避する

私のようにグーグルの検索結果からタイトルを読むだけなので、これは詳細ではなくタイトルに答えるので、Web開発者の観点から説明する必要があると感じました。

  1. YAMLはスペースインデントを使用します。これは、Python開発者にはおなじみの領域です。
  2. JavaScript開発者はJSONが大好きです。JSONはJavaScriptのサブセットであり、JavaScript内で直接解釈および記述でき、JSONを宣言する簡単な方法を使用して、スペースなしの一般的な変数名を使用するときにキーに二重引用符を付ける必要がありません。
  3. YAMLとJSONの両方のすべての言語で非常にうまく機能するパーサーはたくさんあります。
  4. YAMLのスペースフォーマットは、多くの場合、より人間が読める形式のフォーマットが必要なため、見やすくなる場合があります。
  5. よりコンパクトで見やすいYAMLのフォームは、エディターにスペースの書式設定が表示されていない場合、手動で編集することは一見難しい場合があります。タブはスペースではないので、キーストロークをスペースに解釈するエディターがない場合はさらに混乱します。
  6. チェックする機能がYAMLよりも大幅に少ないため、JSONのシリアル化と逆シリアル化の方がはるかに高速です。これにより、JSONを処理するコードをより小さくより軽量にすることができます。
  7. 一般的な誤解は、YAMLが必要な句読点が少なく、JSONよりコンパクトであるということですが、これは完全に誤りです。空白は見えないので文字数は少ないようですが、YAMLが適切にインデントされて正しく解釈されるために必要な実際の空白を数えると、YAMLは実際にはJSONより多くの文字を必要とすることがわかります。JSONは階層またはグループ化を表すために空白を使用せず、よりコンパクトなトランスポートのために不要な空白を削除して簡単にフラット化できます。

部屋の象:インターネット自体

JavaScriptは明らかにウェブを圧倒的に支配しており、JavaScript開発者はデータ形式としてJSONを一般的なWeb APIとともに圧倒的に使用することを好みます。チーム環境で。実際、大多数のWebプログラマーはYAMLが存在することすら知らないだけでなく、YAMLの使用を検討しています。

Webプログラミングを行っている場合、JSONがデフォルトの方法です。JavaScriptを使用する場合は変換手順が必要ないため、その場合はJSONよりもYAMLを使用するためのより適切な引数を考え出す必要があります。


10
Python開発者がYAMLを好むとは思いません。Python dictは基本的にJSONであり、dictsのリストも基本的にJSONです。Pythonにはjson libが組み込まれています。余談ですが、私はPython開発者であり、JSONを好みます(私が知っているほとんどのPython開発者はJSONを好みます)。
karantan

6
空白について本当に私を悩ませていることの1つは、インデントを重ねたり入れなかったりすると、入れ子になったり同じレベルになる可能性があるため、混乱して誤解しやすくなることです。ガイドルールがあります。それは隠されたおっと同様です。これは、yamlを編集するときに誰も言わないような簡単なタイプのシナリオではありません。jsonでその問題が発生したことはありません。
Jason Sebring

6
@JasonSebring。YAMLがなぜスペースを使用したのか不思議に思うでしょう。YAMLの私の最初の「海でのひと泳ぎ」が原因でアプリが壊れました...スペースが原因です。おそらく、非印刷文字を使用せずにインデントを使用する方がはるかに理にかなっていると思ったでしょう!(つまり、なぜ彼らは「」ではなく「」を選択しなかったのですか?)YAMLを理解するには、仕様に行く必要があります。JSONを理解するためにそれは必要ありません。(私は前者に行ったことがあるが、後者には行ったことがない)。これは、実際には「人間が読める」形式ではないことを示しています
cmroanirgo

7
@cmroanirgoええ、これは私の経験でした。上司がJSONを介してYAMLを使用することを強制し、編集と取り込みが不必要に無茶苦茶になりました。私がこれを書いたのは、投票数の増加が私を正当化するためです。
Jason Sebring

3
YAMLのタブに関する問題は、(a)エラーメッセージを読み取らないこと、および(b)タブを強調表示しないエディターがあることを意味します。どちらの問題も簡単に修正できるため、苦情を理解できません。
toolforger '20年

38

この質問は6年前のものですが、不思議なことに、4つの点すべて(速度、記憶力、表現力、移植性)を実際に解決する回答はありません。

速度

明らかにこれは実装に依存しますが、JSONは非常に広く使用されており、実装が簡単であるため、JSONはネイティブサポートを強化し、速度を向上させる傾向があります。YAMLはJSONと同じことをすべて実行し、さらにトラックロードが多いことを考えると、両方の同等の実装の場合、JSONの方が高速になります。

ただし、YAMLファイルは、JSONファイルよりもわずかに小さい可能性があるため(",文字が少ないため)、例外的な状況では、高度に最適化されたYAMLパーサーがより高速になる可能性があります。

記憶

基本的に同じ議論が適用されます。YAMLパーサーが同じデータ構造を表している場合、なぜJSONパーサーがJSONパーサーよりもメモリ効率が優れているのかを理解するのは困難です。

表現力

他の人が指摘したように、PythonプログラマーはYAMLを好む傾向があり、JavaScriptプログラマーはJSONを好む傾向があります。私はこれらの観察をします:

  • JSONの構文全体を覚えるのは簡単です。そのため、JSONファイルの意味を理解することに非常に自信があります。YAMLは本当に人間には理解できません。機微とエッジケースの数は極端です。
  • 仕様全体を実装するパーサーはほとんどないため、特定のコンテキストにおける特定の式の意味を特定するのはさらに困難です。
  • JSONにコメントがないことは、実際には大変なことです。

携帯性

JSONライブラリがない現代の言語を想像するのは難しいです。また、JSONパーサーが完全な仕様以外のものを実装していると想像するのも困難です。YAMLは広くサポートされていますが、JSONよりもユビキタスではなく、各パーサーは異なるサブセットを実装しています。したがって、YAMLファイルは、思ったよりも相互運用性が低くなります。

概要

JSONは、パフォーマンス(関連する場合)と相互運用性の勝者です。YAMLは人間が管理するファイルに適しています。HJSONは適切な妥協策ですが、移植性は大幅に低下します。JSON5は、構文が明確に定義された、より妥当な妥協案です。


3
YAMLの方が小さいのではないかと思っていました。非表示=>そこにはありませんが、実際にはありません。特にYAMLのネストが大きくなると、非表示の文字が存在する必要があることを数えると、JSONをすぐに超えます。人間が読める部分が私たちの大部分をその概念にだまして、JSONとYAMLをあまり平坦化できないと本当に思うまで、それは非常に興味深いと思いました。また、YAMLを読むのではなく、手で編集するのは非常に困難であることがわかりました。
Jason Sebring 2016

1
私はここでの答えのどれもこれを明確に述べていないように感じます:「設定/構成ファイルについては、YAMLはより良いです(誰もが上記の理由のために。マシン/マシンの相互運用についてはJSONを使用してください」)。言い換えると、ターゲットユーザーが人間の場合、YAMLの方が優れています。ターゲットが別のプログラムである場合(ただし、データを人間が読めるようにしたい場合)、JSONを使用します。
Florin T.

それは事実ですが、質問では、2つをどのように比較したいかについて、かなり具体的なパラメータをいくつか示しました。個人的には、私はYAMLを何にも使用しません。相互運用性のためにJSONを使用するか、人間による保守が重要な場合はJSON6を使用します。
スティーブベネット

29

GITとYAML

他の答えは良いです。それらを最初に読んでください。ただし、YAMLを使用する理由をもう1つ追加します。それはgitです。

ますます多くのプログラミングプロジェクトで、配布とアーカイブにgitリポジトリが使用されています。そして、git repoの履歴はJSONファイルとYAMLファイルを等しく保存できますが、ファイルへの変更の追跡と表示に使用される「diff」メソッドは行指向です。YAMLは行指向である必要があるため、YAMLファイル内の小さな変更は人間にとって見やすくなります。

もちろん、文字列/キーをソートしてインデントを追加することで、JSONファイルを「きれいに」作成できることは事実です。しかし、これはデフォルトではなく、私は怠惰です。

個人的には、システム間の相互作用には通常JSONを使用します。私はよく設定ファイル、静的ファイル、追跡ファイルにYAMLを使用します。(また、一般的にはYAMLリレーショナルアンカーを追加することは避けます。寿命が短すぎてループを探すことができません。)

また、速度とスペースが本当に気になる場合は、どちらも使用しません。あなたはBSONを見てみたいかもしれません。


22

YAMLの方が目に優しいと思います。括弧が少ない、 ""などです。YAMLにはタブの煩わしさがありますが、こつこつになります。

パフォーマンス/リソースの点では、この2つの間に大きな違いがあるとは思いません。

さらに、構成ファイルについて話しているので、エンコード/デコードアクティビティの頻度が高いとは思わないでしょうか。


22
タブの煩わし何を意味しているのだろうと思いました。私は事はあると信じてタブ文字をYAMLで許可されていません個人的に、私はあると思う、すべてのソースファイルでは良いアイデア
poolie

6
@poolie:jldupontはおそらく 、YAMLで構文的に重要な先頭の空白ます。
naught101 14

10
はい、でもタブではありません。
poolie 2014

20

YAMLが持っていてJSONが持っていない機能が必要ない場合は、JSONをお勧めします。JSONは非常にシンプルで広くサポートされている(多くの言語で多くのライブラリーを備えている)ためです。YAMLはより複雑で、サポートが少ないです。解析速度やメモリ使用量はそれほど大きくは変わらないと思います。プログラムのパフォーマンスの大部分ではないかもしれません。


3
YAMLはどのように複雑ですか?
Accatyyc

18
たとえば、別の回答で述べられているように、YAMLはアンカーをサポートします。拡張可能なデータ型など、他の機能もあります。これにより、解析がより複雑になり、YAMLの仕様が大きくなる理由が説明されます。パーサーの実装によっては、パフォーマンスが低下する可能性があります(この質問をご覧くださいstackoverflow.com/questions/2451732/…)。
アントンストロゴノフ2012年

5
単純さよりも複雑さの方が優れている場合は、単純さよりも複雑さの方が優れています。データモデルの複雑さによっては、確かにそうです。
ジョナサンノイフェルド

3
ここでは少し遅れるかもしれませんが、YAMLではコメントを追加できますが、JSONでは追加できません。仕様のドキュメントに関しては、私にとっては大きな助けです
モーゼスLiao GZ '19年

@Accatyyc。私は人々がここでの違いについて質問をしているという事実があると思い必ず YAMLはすべてのことは容易ではない記号。Iまし決して(「なぜ私はそれにコメントができないのですか?」を除く)JSONについての質問をしていない
cmroanirgo

15

技術的には、YAMLJSONより多くの機能を提供します (YAML v1.2はJSONのスーパーセットです):

  • コメント
  • アンカーと継承-3つの同一アイテムの例:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
  • ...

ほとんどの場合、人々はそれらの追加機能を使用せず、主な違いは、JSONがブラケットを使用するのに対し、YAMLはインデント使用することです。です。これにより、YAMLがより簡潔で読みやすくなります(訓練された目にとって)。

どれを選ぶ?

  • YAMLの追加機能と簡潔な表記により、構成ファイルに適した選択になります(ユーザーが提供しないファイル)に。
  • JSONの制限された機能、幅広いサポート、より高速な解析により、相互運用性とユーザー提供データの優れた選択肢となります

4

この質問は、YAMLとJSONを検索するときに目立つようになっているので、2つの違いのうち、めったに引用されていない1つの違いに注意してください。ライセンスです。JSONは、JSONユーザーが遵守しなければならないライセンスを持っていると主張しています(法的にあいまいな「悪のためではなく、善のために使用する」を含む)。YAMLにはそのようなライセンスの主張はありませんが、それは(あなたにとってではなくても、弁護士にとって)重要な違いになる可能性があります。


私はJSONを使用しません。JSONと呼ばずに、JSONとまったく同じものを使用します。PS-OFFと呼んでいます。あなたは私を使うために私を訴えるつもりです{ "": #, [] }か?
Andrew

4

場合によっては、どちらか一方を決める必要はありません。

たとえば、Goでは、両方を同時に使用できます。

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}

3

出典:Arnaud Lauret Book「The Design of Web APIs」:

JSONデータ形式

JSONは、JavaScriptプログラミング言語がデータを記述する方法に基づくテキストデータ形式ですが、その名前にもかかわらず、完全に言語に依存しません(https://www.json.org/を参照)。この図に示すように、JSONを使用して、順序付けされていない名前と値のペアを含むオブジェクトと、順序付けされた値を含む配列またはリストを記述できます。

ここに画像の説明を入力してください

オブジェクトは中括弧({})で区切られます。名前は引用符で囲まれた文字列( "name")であり、値はコロン(:)で区切られます。値には、「値」のような文字列、1.23のような数値、ブール(trueまたはfalse)、null値null、オブジェクト、または配列を使用できます。配列は大括弧([])で区切られ、その値はコンマ(、)で区切られます。JSONのフォーマットを容易に任意のプログラミング言語を使用して解析されます。また、読み書きも比較的簡単です。データベース、設定ファイル、そしてもちろんAPIなどの多くの用途に広く採用されています。

YAML

YAML(YAML Ai n't Markup Language)は、人間が使いやすいデータシリアル化形式です。JSONと同様に、YAML(http://yaml.org)はキー/値のデータ形式です。図は、2つの比較を示しています。

ここに画像の説明を入力してください

次の点に注意してください。

  • YAMLのプロパティ名と値を囲む二重引用符( "")はありません。

  • JSONの構造的な中括弧({})とコンマ(、)は、YAMLでは改行とインデントに置き換えられます。

  • YAMLでは、配列の角かっこ([])とコンマ(、)がダッシュ(-)と改行に置き換えられます 。

  • JSONとは異なり、YAMLではハッシュマーク(#)で始まるコメントを使用できます。これらの形式の1つを別の形式に変換するのは比較的簡単です。ただし、YAMLドキュメントをJSONに変換するとコメントが失われます


0

YAMLとJSONの両方が非常に効果的だと思います。私にとって一方が他方よりも上で使用されるときに本当に決定する唯一の2つのことは、言語が最も一般的に使用されるものです。たとえば、Java、JavaScriptを使用している場合は、JSONを使用します。Javaの場合、私は独自のオブジェクトを使用します。これはほとんどJSONですが、一部の機能が不足しています。必要な場合はJSONに変換するか、そもそもJSONで作成します。これは、Javaでは一般的なことであり、他のJava開発者が自分のコードを変更しやすくなるためです。2つ目は、プログラムが属性を記憶するためにそれを使用しているか、またはプログラムが構成ファイルの形式で指示を受け取っているかどうかです。この場合は、YAMLを使用します。構文を見て、変更が非常に簡単で、YAMLがどのように機能するかわからない場合でも。次に、プログラムはそれを読み取り、JSON、またはその言語に適したものに変換します。

結局、それは正直言って問題ではありません。JSONとYAMLはどちらも、経験豊富なプログラマであれば簡単に読み取ることができます。


-1
  • JSONはymlを比較する大きなデータを処理できません

  • 異なるマルチメディア形式の処理には適していません。

  • JSONには「コメント」をサポートする機能がありません。これは、追加の属性としてのみ含めることができます。

  • YAMLには、自己参照、複雑なデータ型のサポート、埋め込みブロックリテラル、コメントなど、JSONに比べていくつかの利点があります。

  • JSONは読み取り専用ですが、YAMLは読み取りと編集が可能です。
  • JSONはYAMLのサブセットであるため、YAMLパーサーはJSONを解析できます。
  • YAMLは余分な区切り文字を使用しないため、XMLやJSONよりも軽量です。

「大きなデータ」と「読み取り専用」のポイントとはどういう意味ですか?JSONはデータ形式ですが、抽象的な概念にはこれらの2つの制限がありますか?
ジョアン・ファリアス

4
@JoãoFariasたとえば、1 GBのJSONファイルと1 GBのCSVファイルがあり、メモリが256 MBあるとします。CSVファイルは1行ずつ処理できますが、JSONでは簡単に処理できません。JSONを解析するよりも、行ごとにYAMLファイルを解析する方がおそらくおそらく簡単です。
NeverEndingQueue 2019
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.