JSONからTypeScript、Python、SQL

JSONオブジェクト、またはオブジェクトの配列を、TypeScriptのinterface、Pythonクラス、Pydanticモデル、またはSQLにします。整形は JSONフォーマッター

このページが作るもの

APIの見本は、多くの場合JSONオブジェクト1件、またはオブジェクトの並びです。このページはその形からTypeScriptのinterface、Pythonクラス、Pydanticモデルを書くか、オブジェクトごとにCREATE TABLEとINSERTを1件書きます。整形と修復はJSONフォーマッターにあります。

使い方

  1. JSONを欄に貼り付けます。入力と同時に更新はオンです。
  2. 向きはTypeScript interface、SQL CREATE TABLE + INSERT、Pythonクラス、Pydanticモデルです。名前の初期値はItemです。省略可能なプロパティは最初からオンです。最後のチェックは、TypeScriptではexport、PythonとPydanticではインポートです。
  3. 変換は1回実行します。例を表示は{"id":1,"name":"Ada","ok":true,"tags":["a","b"],"meta":{"n":2}}を入れ、向きをTypeScript interface、名前をItemにし、両方のチェックをオンのままにします。結果はexport interface Itemで、id?: number、name?: string、ok?: boolean、tags?: string[]、meta?: ItemMetaがあり、さらにexport interface ItemMetaにn?: numberがあります。
  4. 向きをSQL CREATE TABLE + INSERTに切り替えます。テーブルはitemです。列はid BIGINT NOT NULL、name TEXT NOT NULL、ok BOOLEAN NOT NULL、tags TEXT NOT NULL、meta TEXT NOT NULLです。INSERTは1, 'Ada', 1, '["a","b"]', '{"n":2}'です。
  5. 向きをPythonクラスにし、省略可能なプロパティとインポートをオンのままにします。結果はfrom dataclasses import dataclassとfrom typing import Optional, Listで始まり、次に@dataclassのクラスItemMetaでn: Optional[int] = None、次に@dataclassのクラスItemでid、name、ok、tags: Optional[List[str]] = None、meta: Optional[ItemMeta] = Noneです。向きをPydanticモデルにすると、インポートにfrom pydantic import BaseModelが加わり、両方のクラスがBaseModelを継承し、@dataclassはありません。例を表示はTypeScript interfaceのままです。
  6. すべてクリアは両方の欄を空にします。結果をコピーは出力をコピーします。

型の決まり方

ルートはオブジェクト1件、またはオブジェクトの配列である必要があります。数値、文字列、数値の配列はエラーで止まります。キーのないオブジェクトもエラーで止まります。

TypeScriptではboolean、number、stringを使います。そのいずれかの配列はT[]になります。空の配列はunknown[]になります。入れ子のオブジェクトは別のinterfaceになります。親の名前にキーを足すので、Itemの下のmetaはItemMetaです。混在した型はunknownになります。省略可能なプロパティはすべてのフィールドに?を付けます。ルートが配列で、一部のオブジェクトにキーがないときは、省略可能なプロパティがオフでもそのフィールドは省略可能です。exportはexport interfaceと書きます。配列のルートにはコメント// JSON root is Name[]が付きます。

SQLは名前を小文字にし、それ以外の文字をアンダースコアにします。そのためOrder Lineはorder_lineになります。整数はBIGINT、それ以外の数値はDOUBLE、真偽値はBOOLEANで1または0と書き、文字列はTEXTです。入れ子のオブジェクトや配列は、JSONのテキストを入れたTEXTです。文字列の中の単一引用符は二重にします。キーがnull、またはいずれかの行にない場合はNULLを許します。オブジェクト1件がINSERT 1件です。

使う場面

  • APIの見本からTypeScriptのinterfaceの下書きを作る。
  • 入れ子のフィールドをJSONテキストのままにして、JSON配列を読み込む。
  • 名前の中の引用符が、引用符2つとして保存されるか確かめる。

質問

metaが2つ目のinterfaceになるのはなぜですか?

オブジェクトなので、TypeScriptではItemMetaという名前になります。SQLでは同じフィールドが{"n":2}を含むTEXTです。

数値の並びが失敗したのはなぜですか?

オブジェクト1件が1行になります。数値の並びには列がありません。