863

特に次のことを考慮して、YAML と JSON の違いは何ですか?

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

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

関連している:

Perl データの保存に YAML または JSON を使用する必要がありますか?

4

14 に答える 14

759

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

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

一般に、JSON では利用できない 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を参照してください。

于 2009-11-13T14:28:02.737 に答える
252

違い:

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

所見:

  1. Python プログラマーは一般的に YAML の大ファンです。これは、レベルを示すためにブラケット構文ではなくインデントを使用するためです。
  2. 多くのプログラマーは、インデントに「意味」を付けるのは適切ではないと考えています。
  3. データ形式がアプリケーションの環境を離れる場合、UI 内で解析される場合、またはメッセージング レイヤーで送信される場合は、JSON の方が適している可能性があります。
  4. YAML は、文法定義などの複雑なタスクに直接使用でき、多くの場合、新しい言語を発明するよりも優れた選択肢です。
于 2013-06-07T14:17:53.407 に答える
114

難解な理論を迂回する

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

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

部屋の中の象: インターネットそのもの

JavaScript が圧倒的な差で Web を支配していることは明らかであり、JavaScript 開発者は一般的な Web API と共にデータ形式として圧倒的に JSON を使用することを好みます。チーム環境で。実際、Web プログラマーの大半は、YAML の存在にさえ気づいておらず、ましてや YAML の使用を検討していません。

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

于 2016-01-23T02:40:49.883 に答える
63

この質問は 6 年前のものですが、不思議なことに、4 つのポイント (速度、メモリ、表現力、移植性) のすべてに実際に対応している回答はありません。

スピード

明らかにこれは実装に依存しますが、JSON は非常に広く使用されており、実装が非常に簡単であるため、より多くのネイティブ サポートを受ける傾向があり、したがって速度が速くなります。YAML は JSON が行うすべてのことを行い、さらにトラック 1 台分以上を行うことを考慮すると、両方の同等の実装のうち、JSON の方が高速になる可能性があります。

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

メモリー

基本的に同じ議論が成り立ちます。同じデータ構造を表している場合、YAML パーサーが JSON パーサーよりもメモリ効率が高い理由を理解するのは困難です。

表現力

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

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

携帯性

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

概要

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

于 2016-04-12T13:36:40.930 に答える
48

GIT と YAML

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

多くのプログラミング プロジェクトでは、配布とアーカイブに git リポジトリを使用することがますます増えています。また、git リポジトリの履歴は JSON ファイルと YAML ファイルを同等に保存できますが、ファイルへの変更を追跡および表示するために使用される「diff」メソッドは行指向です。YAML は行指向であることを余儀なくされているため、YAML ファイルの小さな変更は人間にとって簡単に確認できます。

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

個人的には、システム間のやり取りには一般的に JSON を使用します。構成ファイル、静的ファイル、および追跡ファイルに YAML をよく使用します。(私は通常、YAML リレーショナル アンカーを追加することも避けています。人生はループを追い詰めるには短すぎます。)

また、速度とスペースが本当に問題になる場合は、どちらも使用しません。BSON を参照してください。

于 2018-03-23T19:35:46.350 に答える
25

YAML の方が見やすいと思います: 括弧が少なく、"" などです。YAML にはタブの煩わしさがありますが...しかし、こつをつかむことができます。

パフォーマンス/リソースに関しては、2 つの間に大きな違いはないと思います。

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

于 2009-11-13T02:46:45.727 に答える
23

技術的には、 YAMLはJSONよりも多くの機能を提供します (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の制限された機能、幅広いサポート、高速な解析により、相互運用性とユーザー提供データに最適です。
于 2016-03-03T13:31:22.893 に答える
22

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

于 2009-11-13T02:50:50.383 に答える
7

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

于 2016-09-20T07:18:59.457 に答える
3

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

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

于 2016-12-06T00:52:30.470 に答える
1

解析速度の向上が懸念される場合は、データを JSON に保存することをお勧めします。ファイルが他のユーザーによって変更される可能性がある場所からデータを解析する必要があったため、JSON よりも読みやすい YAML を使用しました。また、JSON ファイルではできないコメントを YAML ファイルに追加することもできます。

于 2021-04-21T07:03:42.357 に答える