YAMLとJSONの違いは何ですか、特に次の点を考慮してください。
- パフォーマンス(エンコード/デコード時間)
- メモリ消費
- 表現の明快さ
- ライブラリの可用性、使いやすさ(私はCを好む)
私は組み込みシステムでこれら2つのうちの1つを使用して構成ファイルを格納することを計画していました。
YAMLとJSONの違いは何ですか、特に次の点を考慮してください。
私は組み込みシステムでこれら2つのうちの1つを使用して構成ファイルを格納することを計画していました。
回答:
技術的にはYAMLはJSONのスーパーセットです。つまり、少なくとも理論的には、YAMLパーサーはJSONを理解できますが、必ずしもその逆ではありません。
「YAML:Relation to JSON」というタイトルのセクションの公式仕様を参照してください。
一般的に、JAMLで利用できないYAMLについて私が気に入っている点がいくつかあります。
実際には、これらの最後の2つの点のどちらも、おそらくあなたや私が行うことには重要ではありませんが、長期的には、YAMLはより堅牢で実行可能なデータシリアル化形式になると思います。
現在、AJAXおよびその他のWebテクノロジーはJSONを使用する傾向があります。YAMLは現在、オフラインのデータ処理により多く使用されています。たとえば、CベースのOpenCVコンピュータビジョンパッケージにはデフォルトで含まれていますが、JSONは含まれていません。
JSONとYAMLの両方のCライブラリがあります。YAMLのライブラリは新しいものになる傾向がありますが、以前は問題ありませんでした。たとえばYaml-cppを参照してください。
違い:
{a: &b [*b]}
一部のコンバーターでは無限ループするyaml:で再帰的な構造を書き込むことができます。循環検出を使用しても、「yaml爆弾」は依然として可能です(xml爆弾を参照)。観察:
私のようにグーグルの検索結果からタイトルを読むだけなので、これは詳細ではなくタイトルに答えるので、Web開発者の観点から説明する必要があると感じました。
JavaScriptは明らかにウェブを圧倒的に支配しており、JavaScript開発者はデータ形式としてJSONを一般的なWeb APIとともに圧倒的に使用することを好みます。チーム環境で。実際、大多数のWebプログラマーはYAMLが存在することすら知らないだけでなく、YAMLの使用を検討しています。
Webプログラミングを行っている場合、JSONがデフォルトの方法です。JavaScriptを使用する場合は変換手順が必要ないため、その場合はJSONよりもYAMLを使用するためのより適切な引数を考え出す必要があります。
この質問は6年前のものですが、不思議なことに、4つの点すべて(速度、記憶力、表現力、移植性)を実際に解決する回答はありません。
明らかにこれは実装に依存しますが、JSONは非常に広く使用されており、実装が簡単であるため、JSONはネイティブサポートを強化し、速度を向上させる傾向があります。YAMLはJSONと同じことをすべて実行し、さらにトラックロードが多いことを考えると、両方の同等の実装の場合、JSONの方が高速になります。
ただし、YAMLファイルは、JSONファイルよりもわずかに小さい可能性があるため("
と,
文字が少ないため)、例外的な状況では、高度に最適化されたYAMLパーサーがより高速になる可能性があります。
基本的に同じ議論が適用されます。YAMLパーサーが同じデータ構造を表している場合、なぜJSONパーサーがJSONパーサーよりもメモリ効率が優れているのかを理解するのは困難です。
他の人が指摘したように、PythonプログラマーはYAMLを好む傾向があり、JavaScriptプログラマーはJSONを好む傾向があります。私はこれらの観察をします:
JSONライブラリがない現代の言語を想像するのは難しいです。また、JSONパーサーが完全な仕様以外のものを実装していると想像するのも困難です。YAMLは広くサポートされていますが、JSONよりもユビキタスではなく、各パーサーは異なるサブセットを実装しています。したがって、YAMLファイルは、思ったよりも相互運用性が低くなります。
JSONは、パフォーマンス(関連する場合)と相互運用性の勝者です。YAMLは人間が管理するファイルに適しています。HJSONは適切な妥協策ですが、移植性は大幅に低下します。JSON5は、構文が明確に定義された、より妥当な妥協案です。
他の答えは良いです。それらを最初に読んでください。ただし、YAMLを使用する理由をもう1つ追加します。それはgitです。
ますます多くのプログラミングプロジェクトで、配布とアーカイブにgitリポジトリが使用されています。そして、git repoの履歴はJSONファイルとYAMLファイルを等しく保存できますが、ファイルへの変更の追跡と表示に使用される「diff」メソッドは行指向です。YAMLは行指向である必要があるため、YAMLファイル内の小さな変更は人間にとって見やすくなります。
もちろん、文字列/キーをソートしてインデントを追加することで、JSONファイルを「きれいに」作成できることは事実です。しかし、これはデフォルトではなく、私は怠惰です。
個人的には、システム間の相互作用には通常JSONを使用します。私はよく設定ファイル、静的ファイル、追跡ファイルにYAMLを使用します。(また、一般的にはYAMLリレーショナルアンカーを追加することは避けます。寿命が短すぎてループを探すことができません。)
また、速度とスペースが本当に気になる場合は、どちらも使用しません。あなたはBSONを見てみたいかもしれません。
YAMLの方が目に優しいと思います。括弧が少ない、 ""などです。YAMLにはタブの煩わしさがありますが、こつこつになります。
パフォーマンス/リソースの点では、この2つの間に大きな違いがあるとは思いません。
さらに、構成ファイルについて話しているので、エンコード/デコードアクティビティの頻度が高いとは思わないでしょうか。
YAMLが持っていてJSONが持っていない機能が必要ない場合は、JSONをお勧めします。JSONは非常にシンプルで広くサポートされている(多くの言語で多くのライブラリーを備えている)ためです。YAMLはより複雑で、サポートが少ないです。解析速度やメモリ使用量はそれほど大きくは変わらないと思います。プログラムのパフォーマンスの大部分ではないかもしれません。
技術的には、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.
ほとんどの場合、人々はそれらの追加機能を使用せず、主な違いは、JSONがブラケットを使用するのに対し、YAMLはインデントを使用することです。です。これにより、YAMLがより簡潔で読みやすくなります(訓練された目にとって)。
どれを選ぶ?
この質問は、YAMLとJSONを検索するときに目立つようになっているので、2つの違いのうち、めったに引用されていない1つの違いに注意してください。ライセンスです。JSONは、JSONユーザーが遵守しなければならないライセンスを持っていると主張しています(法的にあいまいな「悪のためではなく、善のために使用する」を含む)。YAMLにはそのようなライセンスの主張はありませんが、それは(あなたにとってではなくても、弁護士にとって)重要な違いになる可能性があります。
{ "": #, [] }
か?
出典: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に変換するとコメントが失われます。
YAMLとJSONの両方が非常に効果的だと思います。私にとって一方が他方よりも上で使用されるときに本当に決定する唯一の2つのことは、言語が最も一般的に使用されるものです。たとえば、Java、JavaScriptを使用している場合は、JSONを使用します。Javaの場合、私は独自のオブジェクトを使用します。これはほとんどJSONですが、一部の機能が不足しています。必要な場合はJSONに変換するか、そもそもJSONで作成します。これは、Javaでは一般的なことであり、他のJava開発者が自分のコードを変更しやすくなるためです。2つ目は、プログラムが属性を記憶するためにそれを使用しているか、またはプログラムが構成ファイルの形式で指示を受け取っているかどうかです。この場合は、YAMLを使用します。構文を見て、変更が非常に簡単で、YAMLがどのように機能するかわからない場合でも。次に、プログラムはそれを読み取り、JSON、またはその言語に適したものに変換します。
結局、それは正直言って問題ではありません。JSONとYAMLはどちらも、経験豊富なプログラマであれば簡単に読み取ることができます。
JSONはymlを比較する大きなデータを処理できません
異なるマルチメディア形式の処理には適していません。
JSONには「コメント」をサポートする機能がありません。これは、追加の属性としてのみ含めることができます。
YAMLには、自己参照、複雑なデータ型のサポート、埋め込みブロックリテラル、コメントなど、JSONに比べていくつかの利点があります。