JSON 轉 TypeScript、Python 與 SQL

把一個 JSON 物件,或一組物件,轉成 TypeScript 介面、Python 類別、Pydantic 模型或 SQL。排版仍用 JSON 格式化

這一頁寫出什麼

一份 API 範例常常是一個 JSON 物件,或一組物件。這一頁按這個形狀寫出 TypeScript 介面、Python 類別、Pydantic 模型,或一張 CREATE TABLE,每個物件一條 INSERT。排版和修復仍在 JSON 格式化。

怎麼用

  1. 把 JSON 貼進框裡。輸入時立即更新開著。
  2. 方向是 TypeScript 介面、SQL CREATE TABLE + INSERT、Python 類別或 Pydantic 模型。名稱一開始是 Item。可選屬性一開始勾著。最後一個核取方塊在 TypeScript 下是 export,在 Python 或 Pydantic 下是匯入。
  3. 轉換只做一次。顯示範例填入 {"id":1,"name":"Ada","ok":true,"tags":["a","b"],"meta":{"n":2}},把方向設為 TypeScript 介面,名稱設為 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 介面。
  6. 全部清除清空兩個框。複製結果複製輸出。

型別怎麼定

根必須是一個物件,或物件陣列。數字、字串,或一串數字,會報錯停下。沒有鍵的物件也會報錯停下。

TypeScript 用 boolean、number 和 string。其中一種型別的陣列變成 T[]。空陣列變成 unknown[]。巢狀物件變成另一個介面:父名稱加上鍵名,所以 Item 下面的 meta 是 ItemMeta。混在一起的型別變成 unknown。可選屬性給每個欄位加上 ?。根是陣列、而且某個鍵在部分物件裡沒有時,這個欄位仍是可選的,即使可選屬性沒勾。export 寫出 export interface。根是陣列時加上註解 // JSON root is Name[]。

SQL 把名稱轉成小寫,其他字元換成底線,所以 Order Line 變成 order_line。整數是 BIGINT,其他數字是 DOUBLE,布林是 BOOLEAN,寫成 1 或 0,字串是 TEXT。巢狀物件或陣列是 TEXT,裡面放 JSON 文字。字串裡的單引號寫成兩個。某一列上是 null 或缺失的鍵,可以為空。每個物件一條 INSERT。

用在哪

  • 按一份 API 範例起草 TypeScript 介面。
  • 載入一份 JSON 陣列,巢狀欄位可以繼續當 JSON 文字。
  • 核對名字裡的引號會存成兩個引號。

常見問題

為什麼 meta 是第二個介面?

它是物件,所以 TypeScript 把它命名為 ItemMeta。在 SQL 裡同一個欄位是 TEXT,內容是 {"n":2}。

為什麼一串數字會失敗?

每個物件變成一列。一串數字沒有欄可寫。