web-dev-qa-db-ja.com

YAMLとJSONの違いは何ですか?どちらを優先するか

次のことを考慮して、いつJSONよりもYAMLを使用することを好むべきですか。

  • 性能(エンコード/デコード時間)
  • メモリ消費
  • 表現の明確さ
  • 図書館の利用可能性、使いやすさ(私はCが好きです)

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

関連する

私のPerlデータを保存するためにYAMLかJSONを使うべきですか?

596
pierrotlefou

技術的にはYAMLはJSONのスーパーセットです。これは、理論的には、少なくともYAMLパーサはJSONを理解できるが、必ずしもその逆ではないことを意味します。

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

一般的に、私がYAMLに関して好きなことは、JSONでは利用できません。

  • @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 を参照してください。

566
AndyL

違い:

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

所見:

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

難解な理論を回避する

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

  1. YAMLは空白字下げを使用します。これはPython開発者にとってはおなじみの領域です。
  2. JavaScript開発者はJSONがJavaScriptのサブセットであり、JSONを宣言するための簡単な方法を使用してJavaScript内で直接解釈および記述できるため、JSONを気に入っています。
  3. YAMLとJSONの両方のためにすべての言語で非常にうまく機能するたくさんのパーサーがあります。
  4. YAMLの空白フォーマットは、より読みやすいアプローチを必要とするため、多くの場合見やすくなります。
  5. よりコンパクトで見やすいYAMLの空白は、編集可能な空白が表示されていない場合やインデント行インジケータが表示されていない場合は、見かけ上手作業で編集するのが難しい場合があります。
  6. チェックするYAMLよりも機能が大幅に少ないため、JSONはシリアライズおよびデシリアライズがはるかに高速です。これにより、小型で軽量のコードでもJSONを処理できます。
  7. よくある誤解 は、YAMLは句読点の必要性が少なく、JSONよりもコンパクトであるということですが、これは完全に誤りです。空白は見えないので文字数は少ないように見えますが、YAMLが適切な字下げとともに正しく解釈されるために必要な実際の空白を数えると、YAMLは実際にはJSONよりも多くの文字を必要とします。 JSONは階層やグループ化を表すために空白を使用しないため、不要な空白を削除してよりコンパクトな転送を実現することで簡単にフラット化できます。

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

JavaScriptは明らかにWebを圧倒的に圧倒しており、JavaScript開発者は人気のあるWeb APIと共に圧倒的にデータ形式としてJSONを使用することを好むため、一般的な意味でWebプログラミングを行う場合はYAMLの使用を主張するのは難しいでしょう。チーム環境で。実際、大多数のWebプログラマーはYAMLが存在することに気付いてさえいません、それを使用することを考えてください。

Webプログラミングをしているのであれば、JavaScriptを使用するときは翻訳のステップが不要なのでJSONがデフォルトの方法です。その場合は、JSONよりもYAMLを使用するためのよりよい議論を考え出す必要があります。

73
Jason Sebring

この質問は6歳ですが、奇妙なことに、4つすべての点(速度、記憶、表現力、移植性)すべてに実際に対処する答えはありません。

速度

明らかにこれは実装に依存しますが、JSONは非常に広く使用されていて実装が簡単なので、ネイティブサポートが向上する傾向があり、したがって速度が向上する傾向があります。 YAMLがJSONが行うすべてのことを実行すること、さらにトラックの負荷が大きいことを考えると、両方の類似した実装のうち、JSONの方が速いことが考えられます。

しかし、YAMLファイルはそのJSONの対応物よりもわずかに小さいことがあるため(",の文字数が少ないため)、可能な=高度に最適化されたYAMLパーサーは例外的な状況では速いかもしれません).

記憶

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

表現力

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

  • JSONの構文全体を暗記するのは簡単なので、JSONファイルの意味を理解することに自信を持ってください。 YAMLはどんな人間にも真に理解可能ではありません。微妙な点とEdgeの例の数は極端です。
  • 仕様全体を実装しているパーサーはほとんどないため、特定の文脈で特定の式の意味を確認することはさらに困難です。
  • JSONにコメントがないのは、実際には本当に苦痛です。

移植性

JSONライブラリがないと現代の言語を想像するのは困難です。 JSONパーサーが完全な仕様以外のものを実装しているとも想像するのは困難です。 YAMLは広範囲にサポートされていますが、JSONほど広く普及しているわけではなく、各パーサーは異なるサブセットを実装しています。そのため、YAMLファイルはあなたが思うよりも相互運用性が劣ります。

概要

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

32
Steve Bennett

私はYAMLの方が目に優しいと思います。括弧の数が減ります。 ""など。

パフォーマンスやリソースの面では、両者の間に大きな違いは期待できません。

さらに、私たちは設定ファイルについて話しているので、エンコード/デコードの動作が頻繁に起こるとは思わないでしょう。

21
jldupont

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

18
user181548

GITとYAML

他の答えはいいです。それらを最初に読んでください。しかし、私は時々YAMLを使うもう一つの理由を付け加えます: git

ますます、多くのプログラミングプロジェクトが配布とアーカイブのためにgitリポジトリを使用しています。また、gitリポジトリの履歴にはJSONファイルとYAMLファイルを同じように格納できますが、ファイルへの変更を追跡して表示するために使用される "diff"メソッドは行指向です。 YAMLは行指向であることを余儀なくされているので、YAMLファイルの小さな変更は人間にとって見やすくなっています。

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

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

また、速度とスペースが本当に問題になるのであれば、どちらも使用しません。あなたはBSONを見たいと思うかもしれません。

15
JohnAD

技術的には 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.
    
  • ...

ほとんどの場合人々はそれらの追加機能を使用しないでしょう、そして主な違いはYAMLはインデントを使用しますが、JSONは大括弧を使用するということです。これはYAMLをより簡潔にし、読みやすい(訓練された目のために)にします。

どれを選ぶ?

  • YAML追加の機能と簡潔な表記法は設定ファイル(ユーザー提供ではないファイル)に適しています。
  • JSONの制限された機能、幅広いサポート、そしてより速い解析はそれを相互運用性とユーザー提供のデータのための素晴らしい選択にします
9
Wernight

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

3
Mvr39

時には、あなたは一方を他方のために決める必要がない。

たとえば、Goでは、両方を同時に持つことができます。

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}
3
Michael Dorner
  • JSONは大きなデータを扱うことができません。

  • さまざまなマルチメディアフォーマットの処理には適していません。

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

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

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

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

結局、それは正直なところ問題にならない。 JSONとYAMLはどちらも経験豊富なプログラマーなら誰でも簡単に読むことができます。

0
Triforcey