100% ローカル — データがブラウザの外に出ることはありません

YAMLをpropertiesに変換|Javaが同じ値で読み戻せる

YAMLをJavaの.propertiesに平坦化します。エスケープは任せられるので、Properties.load が読み戻す値は、入れた値とそのまま一致します。

高速 プライベート Cookieゼロ

YAML 入力

Properties 出力

このツールの動作

入れ子は点に、並びは添字になります。

db:
  host: db.example.com
  port: 5432
hosts:
  - a
  - b
db.host=db.example.com
db.port=5432
hosts[0]=a
hosts[1]=b

[i] の形は Spring の慣習で、多くの読み手が期待する書き方です。

エスケープこそが仕事のすべて

.properties は単純に見えて、そのうち三つの規則が黙ってデータを食べます。

空白で始まる値。 Properties.load は区切りの後ろの空白を読み飛ばすので、key= x は x として戻ります。最初の空白を保護すれば——key=\ x——値は生き残ります。末尾の空白はそのままで構いません。

# または ! で始まるキー。 その行はコメントです。キーも値も含めて項目まるごとが読み込み時に消えます。この二文字がキーの先頭に来るときは保護します。

キーの中の =、:、空白も保護し、逆斜線もすべて保護します。値の中の改行は \n、タブは \t になります。

同じ名前に平坦化される二つのキー

"a.b": 1
a:
  b: 2

どちらも a.b になります。形式はこれを区別できず、Properties.load は後のほうを採ります。つまり、二つの値のうち一方は、何の断りもなく消えることになります。

変換は止まり、そのキーを告げます。この道具が変換ではなく拒否を選ぶ唯一の場面であり、変換すれば嘘になる場面でもあります。

型は存在しない

.properties の中身はすべて文字列です。true は "true"、42 は "42"、null は空の値として戻ります。意味を決めるのは読み手です。Boolean.parseBoolean、Integer.parseInt、そして「空」が何を意味するかの判断が要ります。

文字コードについて一言

出力はアクセント付きの文字も含む UTF-8 のテキストです。現代の Java が読むのはこれであり、Properties.load(Reader) が常に読んできたのもこれです。

ただし Properties.load(InputStream)——より古く、より広く使われている呼び出し——は ISO-8859-1 として読み、café は文字化けします。読み手がそれなら、Reader を取る多重定義に切り替えるか、ファイルを渡す前に非 ASCII を \uXXXX に置き換えてください。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜキーが重複として拒否されたのですか。
異なる二つの経路が同じ名前に平坦化されたからです。リテラルのキー `a.b` と、`a:` の下に `b:` がある入れ子は、どちらも `a.b` になります。.properties はこれを区別できず、`Properties.load` は後のほうを採るので、もう一方の値は消えます。代わりに選ぶのではなく、変換は止まって衝突したキーを告げます。
空白で始まる値はどうなりますか。
その空白を `\ ` として保護します。Java は区切りの後ろの空白を読み飛ばすため、`key= x` は `x` として読み戻され、先頭の空白は黙って消えます。最初の一つを保護すれば値はそのまま保たれます。二つ目以降と末尾の空白には何も要りません。
型は保たれますか。
保たれません。どの .properties でも保てません。すべては文字列です。`true`、`42`、`null` は `"true"`、`"42"`、`""` として戻ります。意味を決めるのは読み手側です。これはこの変換の限界ではなく、形式そのものの性質です。

関連ツール