本文へスキップ

JSONからの皮肉な型 — Numio

JSON サンプルから、実行時型チェックライブラリ sarcastic 用のバリデーターを生成します。オブジェクトは is.shape({...})、配列は is.arrayOf(...) になり、配列の一部の要素にしかないキーは is.maybe(...) で囲まれます。

スキーマライブラリを使わない小さな JavaScript プロジェクトで、取得した JSON の形を実行時にチェックする。

JSON

Sarcastic

こんなときに使えます

  • スキーマライブラリを使わない小さな JavaScript プロジェクトで、取得した JSON の形を実行時にチェックする。
  • 想定外のデータで例外を投げるアサーションで、設定やメッセージのペイロードを守る。

使い方

  1. JSON オブジェクトを貼り付けます。フィールドを省略可能にするには、そのフィールドを持つ配列要素と持たない要素を含めます。
  2. 出力を確認します。ルートの shape は RootInterface で、ネストした shape はキー名から命名されます(posts は Posts になります)。
  3. コードをコピーし、is(data, RootInterface) でデータを検証します。一致すれば値を返し、一致しなければ例外を投げます。

JSON 入力

{
  "id": 1,
  "name": "Ada",
  "nickname": null,
  "tags": ["math"],
  "posts": [
    { "title": "Notes", "draft": true },
    { "title": "Engine" }
  ]
}

Sarcastic バリデーター

import is from "sarcastic"

const anyValue = (value) => value

const Posts = is.shape({
  title: is.string,
  draft: is.maybe(is.boolean),
})

const RootInterface = is.shape({
  id: is.number,
  name: is.string,
  nickname: is.maybe(anyValue),
  tags: is.arrayOf(is.string),
  posts: is.arrayOf(Posts),
})

仕様と制限

サイト独自のジェネレーターでブラウザ内で生成され、import is from "sarcastic" の追加と Prettier による整形が行われます。サーバーへのリクエストはありません。

sarcastic には "any" のアサーションがないため、常に null の値は is.maybe(anyValue) になり、出力に小さなヘルパー const anyValue = (value) => value が追加されます。

整数も小数も is.number です。空配列は is.array になり、型が混在する配列は is.arrayOf(is.either(is.number, is.string)) のように is.either を使います。

shape はそれを使う shape より前に宣言されるため、貼り付けたまま実行できます。

FAQ

省略可能なフィールドはどう表されますか?

同じ配列内の一部のオブジェクトで欠けているキーや null のキーは is.maybe(...) で囲まれ、null と undefined を受け付けます。単一オブジェクトの最上位のキーは常に必須です。

ルートが配列の場合はどうなりますか?

要素が 1 つの要素を表す RootInterface shape にマージされ、配列全体を表す const RootInterfaceList = is.arrayOf(RootInterface) が追加されます。

sarcastic は io-ts や Zod と同じものですか?

いいえ。sarcastic はより小さなライブラリで、静的な型推論はありません。TypeScript の型も必要なら JSON → Zod や JSON → io-ts のほうが適しています。

仕様を確認する