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. Необязательные свойства включены с самого начала. Последний флажок — export для TypeScript и импорты для 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[]. Вложенный объект становится другим интерфейсом: имя родителя плюс ключ, поэтому meta под Item — это ItemMeta. Смешанные типы становятся unknown. Необязательные свойства добавляет ? к каждому полю. Если корень — массив и в части объектов нет ключа, поле необязательно, даже когда Необязательные свойства выключены. export пишет export interface. Корень-массив добавляет комментарий // JSON root is Имя[].

SQL переводит Имя в нижний регистр и заменяет прочие символы на подчёркивания, поэтому Order Line становится order_line. Целые — это BIGINT, остальные числа — DOUBLE, логические значения — BOOLEAN и пишутся как 1 или 0, строки — TEXT. Вложенный объект или массив — это TEXT с текстом JSON. Одинарная кавычка внутри строки удваивается. Ключ со значением null или отсутствующий в какой-либо строке допускает NULL. Каждый объект — один INSERT.

Где это нужно

  • Набросать интерфейс TypeScript по примеру ответа API.
  • Загрузить массив JSON, когда вложенные поля могут остаться текстом JSON.
  • Проверить, что кавычка в имени сохраняется как две кавычки.

Вопросы

Почему meta — второй интерфейс?

Это объект, поэтому TypeScript называет его ItemMeta. В SQL то же поле — TEXT с {"n":2}.

Почему список чисел не прошёл?

Каждый объект становится строкой. У списка чисел нет столбцов.