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}。

为什么一串数字会失败?

每个对象变成一行。一串数字没有列可写。