YAML-クイックガイド

YAML Ai n't Markup Languageは、データに関するユーザーの期待に一致するデータシリアル化言語です。人間に優しいように設計されており、他のプログラミング言語と完全に連携します。データの管理に役立ち、Unicodeの印刷可能な文字が含まれています。この章では、YAMLの概要と、その機能についてのアイデアを提供します。

フォーマット

以下に示すテキストを検討してください-

Quick brown fox jumped over the lazy dog.

このためのYAMLテキストは次のように表されます-

yaml.load(Quick brown fox jumped over the lazy dog.)
>>'Quick brown fox jumped over the lazy dog.'

YAMLは値を文字列形式で受け取り、上記のように出力を表すことに注意してください。

次の例を参考にして、YAMLのフォーマットを理解しましょう-

3.1415926の値を持つ次の「pi」のポイント番号について考えてみます。YAMLでは、以下に示すように浮動小数点数として表されます-

>>> yaml.load('3.1415926536')
3.1415926536

以下に説明するように、特定のデータ構造に複数の値がロードされるとします。

eggs
ham
spam
French basil salmon terrine

これをYAMLにロードすると、値はリストの形式である配列データ構造に取り込まれます。出力は以下のようになります−

>>> yaml.load('''
   - eggs
   - ham
   - spam
   - French basil salmon terrine
   ''')
['eggs', 'ham', 'spam', 'French basil salmon terrine']

特徴

YAMLには、データ指向言語とドキュメントマークアップを区別するために、重要な構成を持つマークアップ言語が含まれています。YAMLの設計目標と機能を以下に示します-

  • アジャイル手法のネイティブデータ構造と、Perl、Python、PHP、Ruby、JavaScriptなどの言語と一致します

  • YAMLデータはプログラミング言語間で移植可能

  • データ整合性のあるデータモデルが含まれています

  • 人間が簡単に読める

  • 一方向処理をサポート

  • 実装と使用の容易さ

YAMLとその機能について理解できたところで、構文やその他の操作を使用してYAMLの基本を学びましょう。YAMLには人間が読める構造化フォーマットが含まれていることを忘れないでください。

YAMLファイルを作成するためのルール

YAMLでファイルを作成するときは、次の基本的なルールを覚えておく必要があります-

  • YAMLでは大文字と小文字が区別されます

  • ファイルには .yaml 拡張子として

  • YAMLでは、YAMLファイルの作成中にタブを使用することはできません。代わりにスペースを使用できます

YAMLファイルの基本コンポーネント

YAMLの基本的なコンポーネントを以下に説明します-

従来のブロックフォーマット

このブロックフォーマットは hyphen+space指定されたリストの新しいアイテムを開始します。以下に示す例を観察してください-

--- # Favorite movies
 - Casablanca
 - North by Northwest
 - The Man Who Wasn't There

Inline Format

インライン形式はで区切られます comma and spaceアイテムはJSONで囲まれています。以下に示す例を観察してください-

--- # Shopping list
   [milk, groceries, eggs, juice, fruits]

Folded Text

折りたたまれたテキストは改行をスペースに変換し、先頭の空白を削除します。以下に示す例を観察してください-

- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27

YAMLのすべての基本的な規則に従う構造を以下に示します-

men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams

YAML基本要素の概要

  • YAMLの基本要素の概要は次のとおりです。YAMLのコメントは(#) キャラクター。

  • コメントは、空白で他のトークンと区切る必要があります。

  • 空白のインデントは、構造を示すために使用されます。

  • タブはYAMLファイルのインデントとして含まれていません。

  • リストメンバーは、先頭にハイフン(-)。

  • リストメンバーは角括弧で囲まれ、コンマで区切られます。

  • 連想配列はコロンを使用して表されます ( : )キーと値のペアの形式で。それらは中括弧で囲まれています{}

  • 単一のストリームを持つ複数のドキュメントは、3つのハイフン(---)で区切られます。

  • 各ファイルで繰り返されるノードは、最初はアンパサンド(&)およびアスタリスク(*)後でマークします。

  • YAMLでは、リストの区切り文字としてコロンとコンマを使用し、その後にスカラー値のスペースを含める必要があります。

  • ノードには感嘆符(!)または二重感嘆符(!!)の後に、URIまたはURLに展開できる文字列が続きます。

インデントと分離は、プログラミング言語を学習する際の2つの主要な概念です。この章では、YAMLに関連するこれら2つの概念について詳しく説明します。

YAMLのインデント

YAMLには必須スペースは含まれていません。さらに、一貫性がある必要はありません。有効なYAMLインデントを以下に示します-

a:
   b:
      - c
      -  d
      - e
f:
      "ghi"
  • YAMLでインデントを操作するときは、次のルールを覚えておく必要があります。フローブロックは、現在のブロックレベルを囲む少なくともいくつかのスペースで意図されている必要があります。

  • YAMLのフローコンテンツは複数の行にまたがっています。フローコンテンツの始まりは{ または [

  • -はインデントの一部と見なされるため、ブロックリストアイテムには周囲のブロックレベルと同じインデントが含まれます。

意図されたブロックの例

例でインデントを示す次のコードを観察します-

--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
   given  : Chris
   family : Dumars
   address:
      lines: |
            458 Walkman Dr.
            Suite #292
      city    : Royal Oak
      state   : MI
      postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
   - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

文字列の分離

文字列は、二重引用符で囲まれた文字列を使用して区切られます。指定された文字列の改行文字をエスケープすると、完全に削除され、スペース値に変換されます。

この例では、データ型が文字列の配列構造としてリストされている動物のリストに焦点を当てています。すべての新しい要素は、接頭辞として言及されているように、ハイフンの接頭辞とともにリストされます。

-
 - Cat
 - Dog
 - Goldfish
-
 - Python
 - Lion
 - Tiger

YAMLでの文字列表現を説明する別の例を以下に示します。

errors:
      messages:
         already_confirmed: "was already confirmed, please try signing in"
         confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
         expired: "has expired, please request a new one"
         not_found: "not found"
         not_locked: "was not locked"
         not_saved:
            one: "1 error prohibited this %{resource} from being saved:"
            other: "%{count} errors prohibited this %{resource} from being saved:"

この例は、ユーザーが重要な側面に言及するだけで使用できる一連のエラーメッセージを参照し、それに応じて値をフェッチします。このYAMLのパターンは、YAMLを初めて使用するユーザーが理解できるJSONの構造に従います。

YAMLの構文と基本に慣れてきたので、さらに詳細に進みましょう。この章では、YAMLでコメントを使用する方法を説明します。

YAML supports single line comments。その構造は、例の助けを借りて以下に説明されています-

# this is single line comment.

YAML does not support multi line comments。複数行にコメントを付けたい場合は、以下の例のようにできます。

# this
# is a multiple
# line comment

コメントの特徴

YAMLのコメントの特徴を以下に示します-

  • コメントされたブロックは、実行中にスキップされます。

  • コメントは、指定されたコードブロックの説明を追加するのに役立ちます。

  • コメントはスカラー内に表示してはなりません。

  • YAMLにはハッシュ記号(#)をエスケープする方法が含まれていないため、複数行の文字列内にあるため、コメントを生の文字列値から分割する方法はありません。

コレクション内のコメントを以下に示します-

key: #comment 1
   - value line 1
   #comment 2
   - value line 2
   #comment 3
   - value line 3

YAMLブロックにコメントするためのショートカットキーの組み合わせは Ctrl+Q

使用している場合 Sublime Text editor、ブロックにコメントを付ける手順は以下のとおりです。

ブロックを選択します。LinuxおよびWindowsの場合は「CTRL + /」を使用し、Macオペレーティングシステムの場合は「CMD + /」を使用します。ブロックを実行します。

使用している場合も同じ手順が適用されることに注意してください Visual Studio Code Editor。常に使用することをお勧めしますSublime Text Editor ほとんどのオペレーティングシステムでサポートされているYAMLファイルを作成し、開発者向けのショートカットキーが含まれています。

YAMLには、スコープにインデントを使用するブロックコレクションが含まれています。ここでは、各エントリは新しい行で始まります。コレクション内のブロックシーケンスは、各エントリをdash and space(-)。YAMLでは、ブロックコレクションのスタイルは特定のインジケーターで示されません。YAMLのブロックコレクションは、キーと値のペアの識別が含まれている他のスカラー量と区別できます。

マッピングは、JSON構造に含まれるキー値の表現です。多言語サポートシステムやモバイルアプリケーションでのAPIの作成でよく使用されます。マッピングでは、キーと値のペアの表現を使用します。colon and space ((:)。

スカラーのシーケンスの例を考えてみましょう。たとえば、以下に示すようなボールプレーヤーのリストです。

- Mark Joseph
- James Stephen
- Ken Griffey

次の例は、スカラーをスカラーにマッピングする方法を示しています。

hr: 87
avg: 0.298
rbi: 149

次の例は、スカラーをシーケンスにマッピングする方法を示しています。

European:
- Boston Red Sox
- Detroit Tigers
- New York Yankees

national:
- New York Mets
- Chicago Cubs
- Atlanta Braves

コレクションは、以下に示すシーケンスマッピングに使用できます-

-
   name: Mark Joseph
   hr: 87
   avg: 0.278
-
   name: James Stephen
   hr: 63
   avg: 0.288

コレクションでは、YAMLには、スペースを示すためにインデントを使用する代わりに、明示的なインジケーターを使用するフロースタイルが含まれています。コレクション内のフローシーケンスは、角括弧で囲まれたコンマ区切りのリストとして記述されます。シンフォニーのようなPHPフレームワークに含まれているコレクションの最高のイラスト。

[PHP, Perl, Python]

これらのコレクションはドキュメントに保存されます。YAMLでのドキュメントの区切りは、3つのハイフンまたはダッシュ(---)で示されます。ドキュメントの終わりは3つのドット(…)でマークされています。

YAMLでのドキュメントの区切りは、3つのダッシュ(---)で示されます。ドキュメントの終わりは3つのドット(…)で表されます。

ドキュメント表現は、以下で説明する構造フォーマットと呼ばれます。

# Ranking of 1998 home runs
---
- Mark Joseph
- James Stephen
- Ken Griffey 

# Team ranking
---
- Chicago Cubs
- St Louis Cardinals

スペースの組み合わせを含む疑問符は、構造の複雑なマッピングを示します。ブロックコレクション内に、ユーザーはダッシュ、コロン、疑問符を含む構造を含めることができます。次の例は、シーケンス間のマッピングを示しています-

- 2001-07-23
? [ New York Yankees,Atlanta Braves ]
: [ 2001-07-02, 2001-08-12, 2001-08-14]

YAMLのスカラーは、(()として示されるリテラル型を使用してブロック形式で記述されます。|)。改行カウントを示します。YAMLでは、スカラーは折りたたまれたスタイルで記述されます(>)ここで、各行は、で終わる折り畳まれたスペースを示します empty line または more indented ライン。

新しい行はリテラルで保持されます。以下に示します-

ASCII Art
--- |
\//||\/||
// || ||__

折りたたまれた改行は more indented lines そして blank lines 以下に示すように-

>
Sammy Sosa completed another
fine season with great stats.
63 Home Runs
0.288 Batting Average
What a year!

YAMLフロースカラーには、プレーンスタイルと引用符付きスタイルが含まれます。二重引用符で囲まれたスタイルには、さまざまなエスケープシーケンスが含まれています。フロースカラーには複数の行を含めることができます。この構造では、改行は常に折りたたまれます。

plain:
This unquoted scalar
spans many lines.
quoted: "So does this
quoted scalar.\n"

YAMLでは、タグなしノードは特定のタイプのアプリケーションで指定されます。タグ仕様の例は一般的に使用しますseq, map そして strYAMLタグリポジトリのタイプ。タグは、以下に示す例として表されます-

整数タグ

これらのタグには整数値が含まれています。これらは数値タグとも呼ばれます。

canonical: 12345
decimal: +12,345
sexagecimal: 3:25:45
octal: 014
hexadecimal: 0xC

浮動小数点数

これらのタグには、10進値と指数値が含まれます。それらは指数タグとも呼ばれます。

canonical: 1.23015e+3
exponential: 12.3015e+02
sexagecimal: 20:30.15
fixed: 1,230.15
negative infinity: -.inf
not a number: .NaN

その他のタグ

これには、さまざまな整数値、浮動小数点値、および文字列値が埋め込まれています。したがって、それはその他のタグと呼ばれます。

null: ~
true: y
false: n
string: '12345'

次の完全な長さの例は、JSON形式で変換または処理するときに役立つシンボルとさまざまな表現を含むYAMLの構成を指定します。これらの属性は、JSONドキュメントではキー名とも呼ばれます。これらの表記は、セキュリティの目的で作成されています。

上記のYAML形式は、デフォルト、アダプター、ホストのさまざまな属性を他のさまざまな属性とともに表します。YAMLは、生成されたすべてのファイルのログも保持し、生成されたエラーメッセージの追跡を維持します。指定されたYAMLファイルをJSON形式に変換すると、以下のように目的の出力が得られます-

defaults: &defaults
   adapter:  postgres
   host:     localhost

development:
   database: myapp_development
   <<: *defaults

test:
   database: myapp_test
   <<: *defaults

YAMLをJSON形式に変換して、出力を確認してみましょう。

{
   "defaults": {
      "adapter": "postgres",
      "host": "localhost"
   },
   "development": {
      "database": "myapp_development",
      "adapter": "postgres",
      "host": "localhost"
   },
   "test": {
      "database": "myapp_test",
      "adapter": "postgres",
      "host": "localhost"
   }
}

プレフィックスが「<<:*」のデフォルトのキーは、同じコードスニペットを繰り返し記述する必要がなく、必要に応じて含まれています。

YAMLは、プロセスフローの標準的な手順に従います。YAMLのネイティブデータ構造には、ノードなどの単純な表現が含まれています。これは、表現ノードグラフとも呼ばれます。

これには、シリアル化ツリーを作成するためにシリアル化されるマッピング、シーケンス、およびスカラー量が含まれます。シリアル化では、オブジェクトはバイトのストリームで変換されます。

シリアル化イベントツリーは、次の図に示すように、文字ストリームのプレゼンテーションを作成するのに役立ちます。

逆の手順では、バイトのストリームを解析してシリアル化されたイベントツリーにします。その後、ノードはノードグラフに変換されます。これらの値は、後でYAMLネイティブデータ構造に変換されます。下の図はこれを説明しています-

YAMLの情報は、次の2つの方法で使用されます。 machine processing そして human consumption。YAMLのプロセッサは、上記の図の補完的なビュー間で情報を変換する手順のツールとして使用されます。この章では、YAMLプロセッサが特定のアプリケーション内で提供する必要のある情報構造について説明します。

YAMLには、データオブジェクトをシリアル形式で表すためのシリアル化手順が含まれています。YAML情報の処理には、次の3つの段階があります。Representation, Serialization, Presentation and parsing。それぞれについて詳しく説明しましょう。

表現

YAMLは、次の3種類のノードを使用してデータ構造を表します。 sequence, mapping そして scalar

シーケンス

シーケンスとは、順序付けられたエントリ数を指し、キーと値のペアの順序付けられていない関連付けをマップします。PerlまたはPythonの配列リストに対応します。

以下に示すコードは、シーケンス表現の例です。

product:
   - sku         : BL394D
     quantity    : 4
     description : Football
     price       : 450.00
   - sku         : BL4438H
     quantity    : 1
     description : Super Hoop
     price       : 2392.00

マッピング

一方、マッピングは、辞書のデータ構造またはハッシュテーブルを表します。同じ例を以下に示します-

batchLimit: 1000
threadCountLimit: 2
key: value
keyMapping: <What goes here?>

スカラー

スカラーは、文字列、整数、日付、およびアトミックデータ型の標準値を表します。YAMLには、データ型の構造を指定するノードも含まれていることに注意してください。スカラーの詳細については、このチュートリアルの第6章を参照してください。

シリアル化

YAMLでは、人間にわかりやすいキーの順序とアンカー名を容易にするシリアル化プロセスが必要です。シリアル化の結果はYAMLシリアル化ツリーです。トラバースして、YAMLデータの一連のイベント呼び出しを生成できます。

シリアル化の例を以下に示します-

consumer:
   class: 'AppBundle\Entity\consumer'
   attributes:
      filters: ['customer.search', 'customer.order', 'customer.boolean']
   collectionOperations:
      get:
         method: 'GET'
         normalization_context:
       groups: ['customer_list']
   itemOperations:
      get:
         method: 'GET'
         normalization_context:
            groups: ['customer_get']

プレゼンテーション

YAMLシリアル化の最終出力はプレゼンテーションと呼ばれます。これは、人間に優しい方法でキャラクターストリームを表します。YAMLプロセッサには、ストリームの作成、インデントの処理、コンテンツのフォーマットのためのさまざまなプレゼンテーションの詳細が含まれています。この完全なプロセスは、ユーザーの好みによって導かれます。

YAMLプレゼンテーションプロセスの例は、作成されたJSON値の結果です。理解を深めるために、以下のコードを確認してください。

{
   "consumer": {
      "class": "AppBundle\\Entity\\consumer",
      "attributes": {
         "filters": [
            "customer.search",
            "customer.order",
            "customer.boolean"
         ]
      },
      "collectionOperations": {
         "get": {
            "method": "GET",
            "normalization_context": {
               "groups": [
                  "customer_list"
               ]
            }
         }
      },
      "itemOperations": {
         "get": {
            "method": "GET",
            "normalization_context": {
               "groups": [
                  "customer_get"
               ]
            }
         }
      }
   }
}

構文解析

構文解析は、表示の逆のプロセスです。キャラクターのストリームが含まれ、一連のイベントを作成します。シリアル化イベントの原因となるプレゼンテーションプロセスで導入された詳細は破棄されます。入力の形式が正しくないため、解析手順が失敗する可能性があります。基本的には、YAMLが整形式であるかどうかを確認する手順です。

以下に説明するYAMLの例を考えてみましょう-

---
   environment: production
   classes:
      nfs::server:
         exports:
            - /srv/share1
            - /srv/share3
   parameters:
      paramter1

3つのハイフンで、後で定義されるさまざまな属性を持つドキュメントの開始を表します。

YAML lintはYAMLのオンラインパーサーであり、YAML構造を解析して有効かどうかを確認するのに役立ちます。YAMLlintの公式リンクは以下のとおりです。http://www.yamllint.com/

以下に示すように、解析の出力を確認できます。

この章では、前の章で説明した手順とプロセスについて詳しく説明します。YAMLの情報モデルは、特定の図を使用して体系的な形式でシリアル化と表示手順の機能を指定します。

情報モデルの場合、プログラミング環境間で移植可能なアプリケーション情報を表すことが重要です。

上に示した図は、グラフ形式で表された通常の情報モデルを表しています。YAMLでは、ネイティブデータの表現はルート化され、接続され、タグ付けされたノードの有向グラフになります。有向グラフについて言及すると、有向グラフを持つノードのセットが含まれます。情報モデルで述べたように、YAMLは3種類のノードをサポートします。

  • Sequences
  • Scalars
  • Mappings

これらの表現ノードの基本的な定義については、前の章で説明しました。この章では、これらの用語の概略図に焦点を当てます。次のシーケンス図は、さまざまなタイプのタグとマッピングノードを持つ凡例のワークフローを表しています。

ノードには次の3つのタイプがあります。 sequence node, scalar node そして mapping node

シーケンス

シーケンスノードはシーケンシャルアーキテクチャに従い、0個以上のノードの順序付けられたシリーズを含みます。YAMLシーケンスには、同じノードが繰り返し含まれる場合と、単一のノードが含まれる場合があります。

スカラー

YAMLのスカラーのコンテンツには、一連のゼロの形式で表すことができるUnicode文字が含まれています。一般に、スカラーノードにはスカラー量が含まれます。

マッピング

マッピングノードには、キーと値のペアの表現が含まれています。マッピングノードのコンテンツには、キーと値のペアと、キー名を一意に維持する必要があるという必須条件の組み合わせが含まれています。シーケンスとマッピングは集合的にコレクションを形成します。

上に示した図に示されているように、スカラー、シーケンス、およびマッピングは体系的な形式で表されていることに注意してください。

さまざまな機能にさまざまなタイプの文字が使用されます。この章では、YAMLで使用される構文について詳しく説明し、文字操作に焦点を当てます。

インジケータ文字

インジケーター文字には、YAMLドキュメントのコンテンツを説明するために使用される特別なセマンティクスが含まれています。次の表に、これを詳細に示します。

シニア番号 キャラクターと機能性
1

_

ブロックシーケンスエントリを示します

2

?

マッピングキーを示します

3

:

マッピング値を示します

4

,

フローコレクションエントリを示します

5

[

フローシーケンスを開始します

6

]

フローシーケンスを終了します

7

{

フローマッピングを開始します

8

}

フローマッピングを終了します

9

#

コメントを示します

10

&

ノードのアンカープロパティを示します

11

*

エイリアスノードを示します

12

!

ノードのタグを示します

13

|

リテラルブロックスカラーを示します

14

>

折りたたまれたブロックスカラーを示します

15

`

一重引用符は引用符で囲まれたフロースカラーを囲みます

16

"

二重引用符は二重引用符で囲まれたフロースカラーを囲みます

17

%

使用されるディレクティブを示します

次の例は、構文で使用される文字を示しています-

%YAML 1.1
---
!!map {
   ? !!str "sequence"
   : !!seq [
      !!str "one", !!str "two"
   ],
   ? !!str "mapping"
   : !!map {
      ? !!str "sky" : !!str "blue",
      ? !!str "sea" : !!str "green",
   }
}

# This represents
# only comments.
---
!!map1 {
   ? !!str "anchored"
   : !local &A1 "value",
   ? !!str "alias"
   : *A1,
}
!!str "text"

この章では、YAMLの構文プリミティブの次の側面について学習します。

  • 生産パラメータ
  • インデントスペース
  • 分離スペース
  • 無視される行プレフィックス
  • ラインフォールディング

それぞれの側面を詳しく理解しましょう。

生産パラメータ

プロダクションパラメータには、特定のプロダクションで使用されるパラメータのセットと許可される値の範囲が含まれます。次の本番パラメータのリストはYAMLで使用されます-

インデント

文字で表されます n または m文字ストリームは、それに含まれるブロックのインデントレベルによって異なります。多くのプロダクションがこれらの機能をパラメータ化しています。

環境

それはによって示されます c。YAMLは、次の2つのコンテキストグループをサポートします。block styles そして flow styles

スタイル

sで表されます。スカラーコンテンツは、次の5つのスタイルのいずれかで表示できます。plain, double quoted and single quoted flow, literal and folded block.

チョッピング

それはによって示されます t。ブロックスカラーは、ブロックのトリミングに役立つ多くのメカニズムを提供します。strip, clip そして keep。チョッピングは、改行文字列のフォーマットに役立ちます。ブロックスタイル表現を使用します。チョッピングプロセスは、インジケーターの助けを借りて行われます。インジケーターは、文字列の改行を使用して生成する出力を制御します。改行はで削除されます(-) 演算子と改行は次のように追加されます (+) オペレーター。

チョッピングプロセスの例を以下に示します-

strip: |-
   text↓
clip: |
   text↓
keep: |+
   text↓

指定されたYAMLの例を解析した後の出力は次のとおりです-

インデントスペース

YAML文字ストリームでは、インデントは0文字以上の改行文字として定義されます。覚えておくべき最も重要な点は、インデントにタブ文字を含めてはならないということです。インデントの文字は、ノードのコンテンツ情報の一部と見なしてはなりません。理解を深めるために、次のコードを確認してください。

%YAML 1.1
---
!!map {
   ? !!str "Not indented"
   : !!map {
      ? !!str "By one space"
      : !!str "By four\n spaces\n",
      ? !!str "Flow style"
      : !!seq [
         !!str "By two",
         !!str "Still by two",
         !!str "Again by two",
      ]
   }
}

インデント後に表示される出力は次のとおりです。

{
   "Not indented": {
      "By one space": "By four\n spaces\n", 
      "Flow style": [
         "By two", 
         "Still by two", 
         "Again by two"
      ]
   }
}

分離スペース

YAMLは、トークン間の分離にスペース文字を使用します。最も重要な注意点は、YAMLでの区切りにタブ文字を含めるべきではないということです。

次のコードは、分離スペースの使用法を示しています-

{ · first: · Sammy, · last: · Sosa · }
{
   "\u00b7 last": "\u00b7 Sosa \u00b7", 
   "\u00b7 first": "\u00b7 Sammy"
}

無視される行プレフィックス

空のプレフィックスには、先頭の空白も含まれるスカラータイプに応じて、常にインデントが含まれます。プレーンスカラーにはタブ文字を含めないでください。一方、引用符で囲まれたスカラーにはタブ文字が含まれる場合があります。ブロックスカラーは完全にインデントに依存します。

次の例は、無視された行プレフィックスが体系的に機能することを示しています。

%YAML 1.1
---
!!map {
   ? !!str "plain"
   : !!str "text lines",
   ? !!str "quoted"
   : !!str "text lines",
   ? !!str "block"
   : !!str "text·®lines\n"
}

ブロックストリームで達成される出力は次のとおりです。

{
   "plain": "text lines", 
   "quoted": "text lines", 
   "block": "text\u00b7\u00aelines\n"
}

ラインフォールディング

Line Foldingを使用すると、読みやすくするために長い行を分割できます。短い行の量が多いほど、読みやすさが向上します。行の折り畳みは、長い行の元のセマンティクスに注目することによって実現されます。次の例は、線の折り畳みを示しています-

%YAML 1.1
--- !!str
"specific\L\
trimmed\n\n\n\
as space"

次のように、JSON形式の行折り畳みの出力を確認できます-

"specific\u2028trimmed\n\n\nas space"

YAMLでは、次のようにさまざまな文字ストリームに遭遇します-

  • Directives
  • ドキュメント境界マーカー
  • Documents
  • 完全なストリーム

この章では、それらについて詳しく説明します。

指令

ディレクティブは、YAMLプロセッサーで使用される基本的な命令です。ディレクティブは、シリアル化ツリーに反映されないコメントなどのプレゼンテーションの詳細です。YAMLでは、プライベートディレクティブを定義する方法はありません。このセクションでは、さまざまなタイプのディレクティブと関連する例について説明します。

予約済みディレクティブ

次の例に示すように、予約済みディレクティブは3つのハイフン文字(---)で初期化されます。予約されたディレクティブは、JSONの特定の値に変換されます。

%YAML 1.1
--- !!str
"foo"

YAMLディレクティブ

YAMLディレクティブはデフォルトのディレクティブです。JSONで変換された場合、フェッチされる値には、先行文字と終了文字にスラッシュ文字が含まれます。

%YAML 1.1
---
!!str "foo"

ドキュメント境界マーカー

YAMLはこれらのマーカーを使用して、複数のドキュメントを1つのストリームに含めることができます。これらのマーカーは、YAMLドキュメントの構造を伝えるために特別に使用されます。「---」で始まる行は、新しいドキュメントを開始するために使用されることに注意してください。

次のコードは、これについて例を挙げて説明しています-

%YAML 1.1
---
!!str "foo"
%YAML 1.1
---
!!str "bar"
%YAML 1.1
---
!!str "baz"

ドキュメント

YAMLドキュメントは、単一のルートノードとして提示される単一のネイティブデータ構造と見なされます。ディレクティブ、コメント、インデント、スタイルなどのYAMLドキュメントのプレゼンテーションの詳細は、それらに含まれるコンテンツとは見なされません。

YAMLで使用されるドキュメントには2つのタイプがあります。これらはこのセクションで説明されています-

明示的なドキュメント

ドキュメント開始マーカーで始まり、ルートノードが表示されます。YAML明示宣言の例を以下に示します-

---

some: yaml

...

これには、特定の例では「---」および「…」である明示的な開始マーカーと終了マーカーが含まれています。指定されたYAMLをJSON形式に変換すると、次のような出力が得られます-

{
   "some": "yaml"
}

暗黙のドキュメント

これらのドキュメントは、ドキュメント開始マーカーで始まりません。以下のコードを確認してください-

fruits:
   - Apple
   - Orange
   - Pineapple
   - Mango

これらの値をJSON形式に変換すると、次のように単純なJSONオブジェクトとして出力が得られます。

{
   "fruits": [
      "Apple",
      "Orange",
      "Pineapple",
      "Mango"
   ]
}

完全なストリーム

YAMLには、文字ストリームと呼ばれる一連のバイトが含まれています。ストリームは、文字エンコードを示すバイト順序を含むプレフィックスで始まります。完全なストリームは、文字エンコードを含むプレフィックスで始まり、その後にコメントが続きます。

完全なストリーム(文字ストリーム)の例を以下に示します-

%YAML 1.1
---
!!str "Text content\n"

各プレゼンテーションノードには、次の2つの主要な特性が含まれています。 anchor そして tag。ノードのプロパティは、文字ストリームから省略して、ノードのコンテンツで指定できます。

ノード表現の基本的な例は次のとおりです。

%YAML 1.1
---
!!map {
   ? &A1 !!str "foo"
   : !!str "bar",
   ? !!str &A2 "baz"
   : *a1
}

ノードアンカー

アンカープロパティは、将来の参照用のノードを表します。ノード内のYAML表現の文字ストリームは、ampersand (&)インジケータ。YAMLプロセッサは、アンカー名とその中に構成された表現の詳細を保持する必要はありません。次のコードはこれを説明しています-

%YAML 1.1
---
!!map {
   ? !!str "First occurence"
   : &A !!str "Value",
   ? !!str "Second occurence"
   : *A
}

アンカーノードで生成されたYAMLの出力を以下に示します-

---
!!map {
   ? !!str "First occurence"
   : !!str "Value",
   ? !!str "Second occurence"
   : !!str "Value",
}

ノードタグ

tagプロパティは、ノードを完全に定義するネイティブデータ構造のタイプを表します。タグは(!)インジケーター。タグは、表現グラフの固有の部分と見なされます。次の例では、ノードタグについて詳しく説明しています。

%YAML 1.1
---
!!map {
   ? !<tag:yaml.org,2002:str> "foo"
   : !<!bar> "baz"
}

ノードコンテンツ

ノードコンテンツは、フローコンテンツまたはブロック形式で表すことができます。ブロックコンテンツは行末まで拡張され、インデントを使用して構造を示します。各コレクションの種類は、特定の単一フローコレクションスタイルで表すことも、単一のブロックと見なすこともできます。次のコードはこれを詳細に説明しています-

%YAML 1.1
---
!!map {
   ? !!str "foo"
   : !!str "bar baz"
}

%YAML 1.1
---
!!str "foo bar"

%YAML 1.1
---
!!str "foo bar"

%YAML 1.1
---
!!str "foo bar\n"

この章では、コンテンツを表すために使用されるさまざまなスカラータイプに焦点を当てます。YAMLでは、コメントはスカラーコンテンツの前または後にあります。コメントをスカラーコンテンツに含めないように注意することが重要です。

複数のキーで使用する場合を除いて、すべてのフロースカラースタイルに複数の行を含めることができることに注意してください。

スカラーの表現は以下のとおりです。

%YAML 1.1
---
!!map {
   ? !!str "simple key"
   : !!map {
      ? !!str "also simple"
      : !!str "value",
      ? !!str "not a simple key"
      : !!str "any value"
   }
}

ブロックスカラーヘッダーの生成された出力を以下に示します-

{
   "simple key": {
      "not a simple key": "any value", 
      "also simple": "value"
   }
}

ドキュメントマーカースカラーコンテンツ

この例のすべての文字は、内部スペース文字を含め、コンテンツと見なされます。

%YAML 1.1
---
!!map {
   ? !!str "---"
   : !!str "foo",
   ? !!str "...",
   : !!str "bar"
}

%YAML 1.1
---
!!seq [
   !!str "---",
   !!str "...",
   !!map {
      ? !!str "---"
      : !!str "..."
   }
]

プレーンな改行は、以下の例で表されます-

%YAML 1.1
---
!!str "as space \
trimmed\n\
specific\L\n\
none"

同じものに対応するJSON出力を以下に示します-

"as space trimmed\nspecific\u2028\nnone"

YAMLのフロースタイルは、アンカーとエイリアスを使用してオブジェクトインスタンスを作成する、読みやすい機能のために折り畳みコンテンツ行をカバーするJSONの自然な拡張と考えることができます。この章では、次の概念のフロー表現に焦点を当てます。

  • エイリアスノード
  • 空のノード
  • フロースカラースタイル
  • フローコレクションスタイル
  • フローノード

エイリアスノードの例を以下に示します-

%YAML 1.2
---
!!map {
   ? !!str "First occurrence"
   : &A !!str "Foo",
   ? !!str "Override anchor"
   : &B !!str "Bar",
   ? !!str "Second occurrence"
   : *A,
   ? !!str "Reuse anchor"
   : *B,
}

上記のコードのJSON出力を以下に示します-

{
   "First occurrence": "Foo", 
   "Second occurrence": "Foo", 
   "Override anchor": "Bar", 
   "Reuse anchor": "Bar"
}

コンテンツが空のノードは、空のノードと見なされます。次の例はこれを示しています-

%YAML 1.2
---
!!map {
   ? !!str "foo" : !!str "",
   ? !!str "" : !!str "bar",
}

JSONでの空のノードの出力は次のように表されます-

{
   "": "bar", 
   "foo": ""
}

フロースカラースタイルには、二重引用符、一重引用符、およびプレーンタイプが含まれます。同じものの基本的な例を以下に示します-

%YAML 1.2
---
!!map {
   ? !!str "implicit block key"
   : !!seq [
      !!map {
         ? !!str "implicit flow key"
         : !!str "value",
      }
   ]  
}

上記の例のJSON形式での出力を以下に示します-

{
   "implicit block key": [
      {
         "implicit flow key": "value"
      }
   ] 
}

YAMLのフローコレクションは、別のフローコレクション内のブロックコレクションとネストされています。フロー収集エントリはで終了しますcomma ((,)インジケーター。次の例では、フロー収集ブロックについて詳しく説明します。

%YAML 1.2
---
!!seq [
   !!seq [
      !!str "one",
      !!str "two",
   ],
   
   !!seq [
      !!str "three",
      !!str "four",
   ],
]

JSONでのフロー収集の出力を以下に示します-

[
   [
      "one", 
      "two"
   ], 
   [
      "three", 
      "four"
   ]
]

JSONのようなフロースタイルには、開始インジケーターと終了インジケーターが含まれます。プロパティを持たない唯一のフロースタイルは、プレーンスカラーです。

%YAML 1.2
---
!!seq [
!!seq [ !!str "a", !!str "b" ],
!!map { ? !!str "a" : !!str "b" },
!!str "a",
!!str "b",
!!str "c",]

上記のコードのJSON形式での出力を以下に示します-

[
   [
      "a", 
      "b"
   ], 
   
   {
      "a": "b"
   }, 
   
   "a", 
   "b", 
   "c"
]

YAMLには2つのブロックスカラースタイルが含まれています。 literal そして folded。ブロックスカラーは、コンテンツ自体の前にヘッダーがあるいくつかのインジケーターで制御されます。ブロックスカラーヘッダーの例を以下に示します-

%YAML 1.2
---
!!seq [
   !!str "literal\n",
   !!str "·folded\n",
   !!str "keep\n\n",
   !!str "·strip",
]

デフォルトの動作でのJSON形式の出力を以下に示します-

[
   "literal\n", 
   "\u00b7folded\n", 
   "keep\n\n", 
   "\u00b7strip"
]

ブロックスタイルの種類

ブロックスタイルには次の4つのタイプがあります。 literal, folded, keep そして stripスタイル。これらのブロックスタイルは、ブロックチョッピングシナリオを使用して定義されます。ブロックチョッピングシナリオの例を以下に示します-

%YAML 1.2
---
!!map {
   ? !!str "strip"
   : !!str "# text",
   ? !!str "clip"
   : !!str "# text\n",
   ? !!str "keep"
   : !!str "# text\n",
}

以下に示すように、JSONで3つの形式で生成された出力を確認できます-

{
   "strip": "# text", 
   "clip": "# text\n", 
   "keep": "# text\n"
}

YAMLでチョッピングすると、さまざまな形式で解釈される最後の区切りと末尾の空の行が制御されます。

ストリッピング

この場合、最後の改行と空の行はスカラーコンテンツから除外されます。チョッピングインジケーター「-」で指定します。

クリッピング

明示的なチョッピングインジケータが指定されていない場合、クリッピングはデフォルトの動作と見なされます。最後のブレーク文字は、スカラーのコンテンツに保持されます。クリッピングの最良の例は、上記の例に示されています。改行で終了します“\n” キャラクター。

維持する

維持とは、「+」チョッピングインジケーターの表現による追加を指します。作成された追加の線は折りたたまれません。追加の線は折りたたまれません。

シーケンススタイルを理解するには、コレクションを理解することが重要です。コレクションとシーケンススタイルの概念は並行して機能します。YAMLのコレクションは、適切なシーケンススタイルで表されます。タグの適切な順序を参照する場合は、常にコレクションを参照してください。YAMLのコレクションは、配列で表されるように、ゼロから始まる連続した整数によってインデックスが付けられます。シーケンススタイルの焦点はコレクションから始まります。

宇宙の惑星の数を、コレクションとして作成できるシーケンスと考えてみましょう。次のコードは、宇宙の惑星のシーケンススタイルを表す方法を示しています-

# Ordered sequence of nodes in YAML STRUCTURE
Block style: !!seq
- Mercury   # Rotates - no light/dark sides.
- Venus     # Deadliest. Aptly named.
- Earth     # Mostly dirt.
- Mars      # Seems empty.
- Jupiter   # The king.
- Saturn    # Pretty.
- Uranus    # Where the sun hardly shines.
- Neptune   # Boring. No rings.
- Pluto     # You call this a planet?
Flow style: !!seq [ Mercury, Venus, Earth, Mars,      # Rocks
                    Jupiter, Saturn, Uranus, Neptune, # Gas
                    Pluto ]                           # Overrated

次に、JSON形式の順序付けられたシーケンスの次の出力を確認できます-

{
   "Flow style": [
      "Mercury", 
      "Venus", 
      "Earth", 
      "Mars", 
      "Jupiter", 
      "Saturn", 
      "Uranus", 
      "Neptune", 
      "Pluto"
   ], 
   
   "Block style": [
      "Mercury", 
      "Venus", 
      "Earth", 
      "Mars", 
      "Jupiter", 
      "Saturn", 
      "Uranus", 
      "Neptune", 
      "Pluto"
   ]
}

YAMLのフローマッピングは、キーと値のペアの順序付けられていないコレクションを表します。それらはマッピングノードとも呼ばれます。キーは一意に維持する必要があることに注意してください。フローマッピング構造にキーが重複していると、エラーが発生します。キーの順序は、シリアル化ツリーで生成されます。

フローマッピング構造の例を以下に示します-

%YAML 1.1
paper:
   uuid: 8a8cbf60-e067-11e3-8b68-0800200c9a66
   name: On formally undecidable propositions of  Principia Mathematica and related systems I.
   author: Kurt Gödel.
tags:
   - tag:
      uuid: 98fb0d90-e067-11e3-8b68-0800200c9a66
      name: Mathematics
   - tag:
      uuid: 3f25f680-e068-11e3-8b68-0800200c9a66
      name: Logic

マッピングされたシーケンス(順序なしリスト)のJSON形式での出力は次のとおりです-

{
   "paper": {
      "uuid": "8a8cbf60-e067-11e3-8b68-0800200c9a66",
      "name": "On formally undecidable propositions of Principia Mathematica and related systems I.",
      "author": "Kurt Gödel."
   },
   "tags": [
      {
         "tag": {
            "uuid": "98fb0d90-e067-11e3-8b68-0800200c9a66",
            "name": "Mathematics"
         }
      },
      {
         "tag": {
            "uuid": "3f25f680-e068-11e3-8b68-0800200c9a66",
            "name": "Logic"
         }
      }
   ]
}

上記のようにこの出力を観察すると、YAMLマッピング構造でキー名が一意に維持されていることがわかります。

YAMLのブロックシーケンスは、一連のノードを表します。各項目は、先頭の「-」インジケータで示されます。YAMLの「-」インジケーターは、空白でノードから分離する必要があることに注意してください。

ブロックシーケンスの基本的な表現を以下に示します-

block sequence:
··- one↓
  - two : three↓

ブロックシーケンスをよりよく理解するために、次の例を確認してください。

例1

port: &ports
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *ports

JSON形式のブロックシーケンスの出力を以下に示します-

{
   "port": {
      "adapter": "postgres",
      "host": "localhost"
   },
   "development": {
      "database": "myapp_development",
      "adapter": "postgres",
      "host": "localhost"
   }
}

YAMLスキーマは、タグのセットの組み合わせとして定義され、非特定のタグを解決するためのメカニズムが含まれています。YAMLのフェイルセーフスキーマは、任意のYAMLドキュメントで使用できるように作成されています。また、一般的なYAMLドキュメントの推奨スキーマと見なされます。

タイプ

フェイルセーフスキーマには次の2つのタイプがあります。 Generic Mapping そして Generic Sequence

一般的なマッピング

連想コンテナを表します。ここで、各キーは関連付け内で一意であり、正確に1つの値にマップされます。YAMLにはキー定義の制限はありません。

一般的なマッピングを表す例を以下に示します-

Clark : Evans
Ingy : döt Net
Oren : Ben-Kiki
Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

JSON形式の一般的なマッピング構造の出力を以下に示します-

{
   "Oren": "Ben-Kiki", 
   "Ingy": "d\u00f6t Net", 
   "Clark": "Evans", 
   "Flow style": {
      "Oren": "Ben-Kiki", 
      "Ingy": "d\u00f6t Net", 
      "Clark": "Evans"
   }
}

ジェネリックシーケンス

シーケンスのタイプを表します。これには、ゼロから始まる連続した整数でインデックス付けされたコレクションが含まれます。それはで表されます!!seq 鬼ごっこ。

Clark : Evans
Ingy : döt Net
Oren : Ben-Kiki
Flow style: !!seq { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

この一般的なフェイルセーフシーケンスの出力

schema is shown below:
{
   "Oren": "Ben-Kiki", 
   "Ingy": "d\u00f6t Net", 
   "Clark": "Evans", 
   "Flow style": {
      "Oren": "Ben-Kiki", 
      "Ingy": "d\u00f6t Net", 
      "Clark": "Evans"
   }
}

YAMLのJSONスキーマは、最新のコンピューター言語の共通の分母と見なされています。JSONファイルの解析が可能です。YAMLでは、JSONスキーマで他のスキーマを検討することを強くお勧めします。これの主な理由は、ユーザーフレンドリーなキーと値の組み合わせが含まれていることです。メッセージはキーとしてエンコードでき、必要に応じて使用できます。

JSONスキーマはスカラーであり、値がありません。JSONスキーマのマッピングエントリは、nullが有効として扱われるキーと値のペアの形式で表されます。

null JSONスキーマは、次のように表されます-

!!null null: value for null key
key with null value: !!null null

JSON表現の出力は以下のとおりです-

{
   "null": "value for null key", 
   "key with null value": null
}

次の例は、ブールJSONスキーマを表しています-

YAML is a superset of JSON: !!bool true
Pluto is a planet: !!bool false

以下は、JSON形式での同じものの出力です-

{
   "YAML is a superset of JSON": true, 
   "Pluto is a planet": false
}

次の例は、整数JSONスキーマを表しています-

negative: !!int -12
zero: !!int 0
positive: !!int 34
{
   "positive": 34, 
   "zero": 0, 
   "negative": -12
}

JSONスキーマのタグは次の例で表されます-

A null: null
Booleans: [ true, false ]
Integers: [ 0, -0, 3, -19 ]
Floats: [ 0., -0.0, 12e03, -2E+05 ]
Invalid: [ True, Null, 0o7, 0x3A, +12.3 ]

以下に示すようにJSON出力を見つけることができます-

{
   "Integers": [
      0, 
      0, 
      3, 
      -19
   ], 
   
   "Booleans": [
      true, 
      false
   ], 
   "A null": null, 

   "Invalid": [
         true, 
         null, 
         "0o7", 
         58, 
         12.300000000000001
   ], 
   
   "Floats": [
      0.0, 
      -0.0, 
      "12e03", 
      "-2E+05"
   ]
}