次のことを考慮して、いつJSONよりもYAMLを使用することを好むべきですか。
私は、これら2つのうちの1つを組み込みシステムで使用して構成ファイルを保管することを計画していました。
技術的にはYAMLはJSONのスーパーセットです。これは、理論的には、少なくともYAMLパーサはJSONを理解できるが、必ずしもその逆ではないことを意味します。
"YAML:JSONとの関係" というタイトルのセクションの公式仕様を参照してください。
一般的に、私がYAMLに関して好きなことは、JSONでは利用できません。
実際には、これらの最後の2つの点はどちらもあなたや私がすることには関係ないでしょうが、長期的には、YAMLはより堅牢で実行可能なデータ直列化フォーマットになると思います。
現在のところ、AJAXおよび他のWebテクノロジはJSONを使用する傾向があります。 YAMLは現在オフラインのデータ処理にもっと使われています。たとえば、CベースのOpenCVコンピュータビジョンパッケージにはデフォルトで含まれていますが、JSONは含まれていません。
JSONとYAMLの両方のCライブラリがあります。 YAMLのライブラリは新しいものになる傾向がありますが、私は過去にそれらと問題を抱えていません。例えば Yaml-cpp を参照してください。
違い:
{a: &b [*b]}
に書くことは可能です。これはいくつかのコンバーターで無限ループします。循環検出でも、「ヤム爆弾」はまだ可能です( xml bomb を参照)。所見:
これは、私のようにgoogleでの検索結果からタイトルを読むだけなので、詳細ではなくタイトルに答えるため、 をWeb開発者の観点から説明する必要があると感じました 。
JavaScriptは明らかにWebを圧倒的に圧倒しており、JavaScript開発者は人気のあるWeb APIと共に圧倒的にデータ形式としてJSONを使用することを好むため、一般的な意味でWebプログラミングを行う場合はYAMLの使用を主張するのは難しいでしょう。チーム環境で。実際、大多数のWebプログラマーはYAMLが存在することに気付いてさえいません、それを使用することを考えてください。
Webプログラミングをしているのであれば、JavaScriptを使用するときは翻訳のステップが不要なのでJSONがデフォルトの方法です。その場合は、JSONよりもYAMLを使用するためのよりよい議論を考え出す必要があります。
この質問は6歳ですが、奇妙なことに、4つすべての点(速度、記憶、表現力、移植性)すべてに実際に対処する答えはありません。
明らかにこれは実装に依存しますが、JSONは非常に広く使用されていて実装が簡単なので、ネイティブサポートが向上する傾向があり、したがって速度が向上する傾向があります。 YAMLがJSONが行うすべてのことを実行すること、さらにトラックの負荷が大きいことを考えると、両方の類似した実装のうち、JSONの方が速いことが考えられます。
しかし、YAMLファイルはそのJSONの対応物よりもわずかに小さいことがあるため("
と,
の文字数が少ないため)、可能な=高度に最適化されたYAMLパーサーは例外的な状況では速いかもしれません).
基本的に同じ議論が適用されます。同じデータ構造を表しているのであれば、なぜYAMLパーサがJSONパーサよりもメモリ効率が良いのかを理解するのは困難です。
他の人が指摘したように、PythonプログラマーはYAMLを好む傾向があり、JavaScriptプログラマーはJSONを好む傾向があります。私はこれらの観察をするつもりです:
JSONライブラリがないと現代の言語を想像するのは困難です。 JSONパーサーが完全な仕様以外のものを実装しているとも想像するのは困難です。 YAMLは広範囲にサポートされていますが、JSONほど広く普及しているわけではなく、各パーサーは異なるサブセットを実装しています。そのため、YAMLファイルはあなたが思うよりも相互運用性が劣ります。
JSONはパフォーマンス(関連する場合)と相互運用性の勝者です。 YAMLは人間が管理するファイルに向いています。 _ hjson _ は移植性がかなり低下しますが、かなりの妥協です。 JSON5 は、明確に定義された構文で、より合理的な妥協案です。
私はYAMLの方が目に優しいと思います。括弧の数が減ります。 ""など。
パフォーマンスやリソースの面では、両者の間に大きな違いは期待できません。
さらに、私たちは設定ファイルについて話しているので、エンコード/デコードの動作が頻繁に起こるとは思わないでしょう。
YAMLが持っていてJSONが持っていない機能を必要としないのであれば、JSONが非常に単純で広くサポートされている(多くの言語でたくさんのライブラリを持っている)ので私はJSONを好むでしょう。 YAMLはより複雑でサポートも少ないです。私は、解析速度やメモリ使用量がそれほど変わらないとは思いません。そして、おそらくあなたのプログラムのパフォーマンスの大部分ではないでしょう。
他の答えはいいです。それらを最初に読んでください。しかし、私は時々YAMLを使うもう一つの理由を付け加えます: git 。
ますます、多くのプログラミングプロジェクトが配布とアーカイブのためにgitリポジトリを使用しています。また、gitリポジトリの履歴にはJSONファイルとYAMLファイルを同じように格納できますが、ファイルへの変更を追跡して表示するために使用される "diff"メソッドは行指向です。 YAMLは行指向であることを余儀なくされているので、YAMLファイルの小さな変更は人間にとって見やすくなっています。
もちろん、JSONファイルは、文字列/キーをソートしてインデントを追加することで「きれいに」できます。しかし、これはデフォルトではなく、私は怠け者です。
個人的には、私は通常システム間の対話にJSONを使用します。私はよく設定ファイル、静的ファイル、そして追跡ファイルにYAMLを使います。 (私は一般的にYAMLリレーショナルアンカーを追加することも避けています。人生は短すぎるためループを探すことができません。)
また、速度とスペースが本当に問題になるのであれば、どちらも使用しません。あなたはBSONを見たいと思うかもしれません。
技術的には 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を検索する際に際立って機能するようになったので、この2つの間にめったに引用されない違いの1つに注目する価値があります。 JSONは license JSONユーザーが遵守しなければならないと主張しています(合法的にあいまいなものは「悪くないために使われるものとします」を含む)。 YAMLはそのようなライセンスの主張をしていません、そしてそれは重要でないかもしれません(あなたにとってではないとしてもあなたの弁護士にとって)。
時には、あなたは一方を他方のために決める必要がない。
たとえば、Goでは、両方を同時に持つことができます。
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
JSONは大きなデータを扱うことができません。
さまざまなマルチメディアフォーマットの処理には適していません。
JSONには「コメント」をサポートする機能はありません。これは追加の属性としてのみ含めることができます。
YAMLには、自己参照、複雑なデータ型のサポート、埋め込みブロックリテラル、コメントなど、JSONよりも優れた点がいくつかあります。
私はYAMLとJSONの両方が非常に効果的であると思います。 1つが私のために他のものの上に使用されるとき本当に指示する唯一の2つの事は1つ、言語が最もよく使用されているものです。たとえば、Java、Javascriptを使用している場合は、JSONを使用します。 Javaについては、私はそれら自身のオブジェクトを使用します。それはほとんどJSONですが、いくつかの機能が欠けています、そしてもし最初にJSONでそれをする必要があるなら、それをJSONに変換します。これは、Javaで一般的なことであり、他のJava開発者が自分のコードを変更するのを容易にするためです。 2つ目は、プログラムが属性を記憶するために使用しているのか、プログラムが設定ファイルの形式で指示を受け取っているのか、という場合です。この場合、YAMLを使用します。 YAMLがどのように機能するのかわからない場合でも、構文を見て変更するのは非常に簡単です。その後、プログラムはそれを読み込んでJSON、またはその言語に適したものに変換します。
結局、それは正直なところ問題にならない。 JSONとYAMLはどちらも経験豊富なプログラマーなら誰でも簡単に読むことができます。