(rontolisp) docs
← 関数

rontolisp:json-stringify

(rontolisp:json-stringify value)

Lisp の値を JSON ドキュメント文字列にシリアライズします。挙動は com.inuoe.jzon ライブラリのデフォルトに 従い、rontolisp:json-parse の逆になります: ハッシュテーブルはオブジェクトに、ベクタまたはリストは配列になり、 nilt・シンボル null はそれぞれ falsetruenull になります。 jzon の軽量なサブセットなので、形を変えずに jzon へ切り替えられます。

サブセットの範囲を超えたら com.inuoe.jzon に切り替えてください: より高機能が 必要なとき(プリティ出力、ストリーミングライタ、:replacer、カスタム シリアライズ)や、JSON のコードを他の Common Lisp 処理系に移植可能に したいときです — com.inuoe.jzon は標準的なライブラリで、rontolisp:json-* は rontolisp 上でのみ動作します。

値の対応

LispJSON
nilfalse
ttrue
シンボル nullnull
整数、浮動小数点数number
number(float で変換)
string文字列(引用符・バックスラッシュ・制御文字はエスケープ)
ベクタ、リストarray
ハッシュテーブルオブジェクト(シンボルのキーは、小文字を含まない限り小文字化されます)
CLOS インスタンス(standard-object)オブジェクト(各スロット名 → その値、定義順)
キーワード、シンボル、文字文字列

それ以外(関数、ストリーム、多次元配列)はエラーを通知します。

ハッシュテーブルと CLOS インスタンスはどちらもオブジェクトとして シリアライズされるため、オブジェクトを構築する方法は 2 通りあります — 動的なキーにはハッシュテーブル(多くは rontolisp:plist-hash-table 経由)、 固定された形にはクラスです。スロット自体がハッシュテーブル(ネストした オブジェクト)、リストやベクタ(配列)、あるいは別のインスタンスを保持して いても構いません:

JSON からパースした値は構造的にラウンドトリップします:

制限事項

  • nilfalse にシリアライズされ、空リストは nil なので、空の配列には #()(空のベクタ)を、空のオブジェクト {} には空のハッシュテーブルを 使ってください。
  • リストは常に配列になります — JSON オブジェクトにはハッシュテーブルを 構築してください(jzon は alist/plist の判定を廃止しており、このサブセットも 同様です)。rontolisp:plist-hash-table は キーワードのプロパティリストを、 rontolisp:alist-hash-table は連想リストを、 そのハッシュテーブルに変換します。
  • 出力中のハッシュテーブルのキー順序はバックエンド依存(未規定)です (maphash と同様)。
  • 非 ASCII 文字はそのまま出力されます(\uXXXX エスケープはしません)。 これは正しい JSON です。
  • WASM バックエンドでは絶対値が 2³¹ 以上の浮動小数点数はシリアライズ できません(浮動小数点数フォーマッタがトラップします)。 WASM ガイド を参照してください。

バックエンドサポート

rontolisp:json-parse と同じく、すべての バックエンド・すべての WASM モード(Preview 1 含む)で動作します: シリアライザは rontolisp 自身で書かれており、使用時にプログラムへ 組み込まれてコンパイルされます。