
# JSONC

storhのストレージファイルはJSONオブジェクトです。読み取りでは、行コメント、ブロックコメント、末尾のカンマを含むJSONCを受け付けます。そのため、レコードファイルを安全にエディターで開いて注釈を付けられます。storhが解析を行います。

```jsonc
{
  // Application-owned fields live under data.
  "id": "018bcfe5-6800-7000-8000-000000000000",
  "data": {
    "title": "Home",
  },
}
```

読み取りでは、まず厳密な`json_decode`解析を試み、失敗した場合にのみJSONCストリッパーにフォールバックします。そのため、正規形式のファイルでコメント処理のコストはかかりません。

## storhが書き込む形式

書き込みでは、末尾に改行を付けた正規形式のコンパクトな1行のJSONが生成されます。

```text
{"id":"018bcfe5-6800-7000-8000-000000000000","data":{"title":"Home"}}
```

コメントと独自の書式は、storhがそのレコードを書き換えるまで保持されます。同じIDへの`put()`では、ファイル全体が正規形式の出力で置き換えられます。そのため、コメントは一時的なメモとして扱い、永続メタデータには使わないでください。永続させる情報は`data`に保存してください。

エンコードではUnicodeとスラッシュをエスケープせずに保持し、浮動小数点数の小数部がゼロでも維持します（`1.0`は`1.0`のまま）。そのため、同じデータをデコードして再エンコードしても、バイト単位で一致します。インデックスマニフェストなどの内部メタデータファイルはJSONオブジェクトで、同じ許容範囲で読み取られます。

`Jsonc::decode_object()`はオブジェクト以外のドキュメントと不正な入力を拒否します。`Jsonc::encode_object()`と`Jsonc::encode_compact_object()`は、配列をオブジェクトドキュメントとして書き込みます。
