# YAMLをJSONに — そしてJSONをYAMLに戻す

双方向で、それぞれの代償も伝えます。どちらも、よそのサーバーに貼り付けられることはありません。

> 対応するYAML 1.2のサブセットをブラウザでJSONに変換し、JSONをYAMLに戻します。アンカー、エイリアス、タグ、複数文書は拒否します。JSONではコメントを保持しません。アップロードはありません。

これはhttps://abox.tools/ja/yaml-to-json/にあるブラウザー用の対話型ツールです。ファイルはそのブラウザーを実行する端末上で処理します。意図した共有や任意の通信機能はページ内で説明します。以下は文章による説明です。利用するにはアドレスを開いてください。

## YAMLとJSONは**ブラウザー内で処理**されます。処理のためのアップロードはありません。

変換は文字列に対する計算で、それをここ、このページで行います。二つのパーサーはどちらも手書きで`src/`にあります。`shared/parse-yaml.js`と`shared/parse-json.js`で、それ以上のものはありません。この道具にはネットワーク機能そのものがなく、取りに行くものも送るものもありません。それはこのサイトのほぼどこよりも重い意味を持ちます。YAMLファイルはたいてい配備の設定であり、配備の設定はたいていホスト名とバケット名と秘密でいっぱいだからです。

- ✗ アップロードなし
- ✗ 登録なし
- ✗ サイズ制限なし
- ✓ オフラインで動作
- ✓ ソース公開

## YAMLをアップロードせずにJSONへ変換する手順

1. **向きを選びます。** *YAMLからJSONへ*か、*JSONからYAMLへ*。メニューの下の注記が、その向きで何が失われるかを、何かを貼り付ける前に伝えます。あとからではありません。
2. **貼り付けるか、ファイルを置きます。** 選択してコピーできるものなら何でも構いません。選択欄に置いたファイルはご自分のブラウザが読んで欄に入れます。省くべきアップロードの段階自体がなく、拡張子が`.json`や`.yaml`なら向きもそれで決まります。
3. **インデントを選びます。** 半角空白2つ、4つ、またはタブ。タブはJSONのときだけ選べます。YAMLは半角空白で定義されていて、タブは正しいインデントになりません。
4. **エラーのある場所でエラーを読みます。** ここで失敗したパーサーは、「位置4193に予期しないトークン」ではなく、何を見つけたのかを行と列とともに伝えます。たいていはそれだけで、ほかに何も開かずに設定ファイルを直せます。
5. **結果を持ち帰ります。** コピーするか、出てきた形式の名前が付いたファイルとしてダウンロードします。

## 詳しい解説

[YAMLとJSONを相互変換する方法](https://abox.tools/ja/guides/convert-yaml-and-json/): 対応するYAMLのサブセットをブラウザでJSONに変換し、JSONをYAMLに戻します。再使用前にコメントの損失、未対応構文、正確な数値文字列を確認します。

## 箱の中のほかのツール

- [XMLフォーマッター](https://abox.tools/ja/xml-formatter/): 読むために整えたXML、送るために平たく圧縮したXML、そして双方向のJSON変換。そのどれも、よそのサーバーに貼り付けられることはありません。
- [テキスト差分](https://abox.tools/ja/text-diff/): 2つのテキストを入れると、すべての違いが行単位・単語単位で印付きで出てきます。よそのサーバーに貼り付けるものは何もありません。
- [Base64エンコーダー・デコーダー](https://abox.tools/ja/base64/): Base64、パーセントエンコード、HTMLエンティティ、16進、バックスラッシュのエスケープを双方向で。よそのサーバーに貼り付けるものは何もありません。
- [テキストとファイルの共有](https://abox.tools/ja/share-text/): 共有はこの開いたタブの中だけに存在します。読む側は暗号化された内容をあなたのブラウザから直接受け取り、タブを閉じれば終わり。どのサーバーにも何も残りません。

## よくある質問

### 私のYAMLはどこかにアップロードされますか？

されません。このページの二つのパーサーも二つのプリンターも、ご自分のブラウザの中で、ご自分のハードウェア上で動く関数です。この道具にはネットワーク機能そのものがなく、何かを取りに行くことも送ることもありません。ページの`Content-Security-Policy`には接続してよいアドレスがすべて書かれていて、そのどれもこのサイトのものではありません。配備の設定にこれを使う理由がまさにそれです。ああいうファイルはホスト名とバケット名で、ときには誰かが移そうとした秘密でいっぱいで、それをよその変換ツールに貼り付けることは、相手に渡すことです。

### YAMLをJSONに変換すると何が失われますか？

JSONではコメントを保持できません。このパーサーはYAML 1.2のサブセットを意図的に扱い、展開方法や型変換を勝手に選ばず、アンカー、エイリアス、タグを拒否します。JSONは値の木構造を表し、YAMLは共有ノードや型付きの値も表せます。複数文書ストリームも独自の配列に包まず拒否します。JSONからYAMLへは表されている値を保持します。[YAML仕様](https://yaml.org/spec/1.2.2/)で形式全体を確認できます。

### YAMLにnoと書いたのに、JSONでは文字列で出てきました。なぜですか？

YAML 1.1は`yes`、`no`、`on`、`off`を真偽値として読み、ノルウェーの国コードを`false`にしました。この対応サブセットはYAML 1.2の規則を使い、これらを文字列、`true`と`false`を真偽値、`null`と`~`をnull、数値スカラーを数値として読みます。古い規則の読み手に備え、YAMLの出力では曖昧な単語を引用符で囲みます。

### キーの順序は保たれますか？

保たれます。双方向でです。そしてこれは聞こえるより難しいことです。`JSON.parse`の上に作られた変換ツールは、整数に見えるキーを黙って前へ動かすので、`{"10":a,"2":b}`が`{"2":b,"10":a}`になって戻ってきます。数値は打ち込んだ桁をそのまま保つので、20桁の口座番号が下3桁を倍精度浮動小数点に奪われることもありません。*並べ替えたい*ときはチェックボックスがあり、コードポイント順ではなくキーの読み方の順に並べます。

### 複数のYAML文書をまとめて変換できますか？

できませんし、どれか一つを選ぶ代わりにそう伝えます。`---`で区切られたファイルは複数の文書を持っていて、JSONには「複数の文書」を意味する形がありません。配列にすれば、ファイルが一度もしていない主張をすることになります。一つずつ変換してください。

### ここにYAMLの整形機能がないのはなぜですか？

YAMLには書く値打ちのある圧縮形がないからです。短い書き方はフロースタイルですが読めたものではなく、読めないことは、ファイルをYAMLで持っておく理由の正反対です。JSON・XML・HTML・CSSを整えるのは[JSONフォーマッター](https://abox.tools/ja/json-formatter/)の仕事で、そちらはYAMLも整えます。

### どれくらい大きいファイルまで扱えますか？

ここに制限は設けていません。その費用を払うサーバーがないからです。実際の上限はご自分の端末です。数メガバイトのYAMLなら問題なく、とても長い文書のときは、キーボードを奪い合う代わりに入力が止むのを待ってから変換します。

### 無料ですか。アカウントは必要ですか？

無料です。アカウントも、サインインも、試用期間もなく、貼り付ける量にも制限はありません。このサイトには広告があり、それが費用をまかなっています。広告にはあなたのテキストについて何も渡されません。

### オフラインでも動きますか？

動きます。ページを一度読み込んだあとインターネットを切っても、そのまま使えます。これは何もアップロードされていないことを示す一番簡単な方法でもあります。変換のために設定を送り出す道具なら、線を抜いた瞬間に止まってしまうはずです。

## この主張を確かめる方法

- **処理はこのブラウザー内で行います。** 入力と結果はブラウザー内で処理し、処理コードはそれらを処理用にアップロードしません。Content-Security-Policyは資源と接続先を制限しますが、許可済みの相手はリクエストを受け取れます。内容は検査せず、何も送られないことを単独で証明しません。具体的な操作の要求とソースを比較するか、切断中にローカル操作を完了してください。
- **ここからは何も取りに行きません。** `src/`のどこにも`fetch`も`XMLHttpRequest`も`sendBeacon`もありません。二つのパーサーも二つのプリンターも、文字列を受け取って文字列を返す、このページの中の関数です。
- **対応するサブセットはYAML 1.2のスカラー規則を使います。** YAML 1.1では`no`が真偽値でした。ノルウェーの国コードを`false`に変えてしまう、あの有名なバグです。ここで読むのは1.2で、そこでは見たとおりの文字列です。逆向きでは、それらの語は*引用符付き*で書き戻します。次にそのファイルを開くものが、まだ1.1の読み取り器かもしれないからです。`tests/js/text-convert.test.js`が両方を確かめています。
- **正直でいられない変換は、代わりに止まります。** JSONではコメントを保持できません。このパーサーはYAML 1.2のサブセットを意図的に扱い、展開方法や型変換を勝手に選ばず、アンカー、エイリアス、タグを拒否します。JSONは値の木構造を表し、YAMLは共有ノードや型付きの値も表せます。複数文書ストリームも独自の配列に包まず拒否します。JSONからYAMLへは表されている値を保持します。
- **Googleが読み込むものと、渡されないもの。** 広告と計測のスクリプトはGoogleから、寄付ボタンはBuy Me a Coffeeから来ます。そのどれにも、あなたのテキストは1文字も渡されません。それを読み、解析し、書き出すすべての行は、このオリジンから配信され、リポジトリに載っています。
- **オフラインで動きます。** ネットワークを切っても道具は何も変わりません。もともとネットワークの段階がなかったからです。これが何よりも簡単な証明です。

**自分で確かめてください。**以上のどれも、鵜呑みにする必要はありません。このページは、リポジトリにあるテンプレートと設定から、誰でも読んで実行できるビルドスクリプトが生成しています。その結果は`dist`ブランチに置いてあるので、配信されているものと、ソースをビルドした結果とを差分で比べられます。 https://github.com/A-Box-of-Tools/website

まず読むとよいのは、Content-Security-Policyについては`config/site.toml`、アンカーの意味を推し量る代わりに拒む読み取り器は`src/shared/parse-yaml.js`、変換がなぜ「パーサーとプリンターだけで、両方の形式を同時に知る何かが間に挟まらない」ものなのかは`src/convert.js`をご覧ください。
