JSON para TypeScript, Python e SQL

Transforme um objeto JSON, ou um array de objetos, numa interface TypeScript, numa classe Python, num modelo Pydantic ou em SQL. A formatação continua no formatador JSON

O que esta página constrói

Uma amostra de API costuma ser um objeto JSON, ou um array de objetos. Esta página escreve uma interface TypeScript, uma classe Python, um modelo Pydantic, ou um CREATE TABLE e um INSERT por objeto. A formatação e o reparo continuam no formatador JSON.

Como se usa

  1. Cole o JSON na caixa. Atualizar ao digitar está ligado.
  2. Sentido é Interface TypeScript, SQL CREATE TABLE + INSERT, Classe Python ou Modelo Pydantic. Nome começa em Item. Propriedades opcionais começa marcado. A última caixa é export em TypeScript, e imports em Python ou Pydantic.
  3. Converter corre uma vez. Mostrar exemplo preenche {"id":1,"name":"Ada","ok":true,"tags":["a","b"],"meta":{"n":2}}, põe Sentido em Interface TypeScript, Nome em Item e deixa as duas caixas marcadas. O resultado tem export interface Item com id?: number, name?: string, ok?: boolean, tags?: string[] e meta?: ItemMeta, mais export interface ItemMeta com n?: number.
  4. Mude Sentido para SQL CREATE TABLE + INSERT. A tabela é item. As colunas são id BIGINT NOT NULL, name TEXT NOT NULL, ok BOOLEAN NOT NULL, tags TEXT NOT NULL e meta TEXT NOT NULL. O INSERT é 1, 'Ada', 1, '["a","b"]', '{"n":2}'.
  5. Mude Sentido para Classe Python e deixe marcadas Propriedades opcionais e imports. O resultado começa com from dataclasses import dataclass e from typing import Optional, List, depois a classe @dataclass ItemMeta com n: Optional[int] = None, depois a classe @dataclass Item com id, name, ok, tags: Optional[List[str]] = None e meta: Optional[ItemMeta] = None. Mude Sentido para Modelo Pydantic: os imports acrescentam from pydantic import BaseModel e ambas as classes estendem BaseModel, sem @dataclass. Mostrar exemplo fica em Interface TypeScript.
  6. Limpar tudo esvazia as duas caixas. Copiar resultado copia a saída.

Como os tipos são escolhidos

A raiz tem de ser um objeto, ou um array de objetos. Um número, uma cadeia ou um array de números para com um erro. Um objeto sem chaves para com um erro.

TypeScript usa boolean, number e string. Um array de um desses tipos passa a T[]. Um array vazio passa a unknown[]. Um objeto aninhado passa a outra interface: o nome do pai mais a chave, por isso meta sob Item é ItemMeta. Tipos mistos passam a unknown. Propriedades opcionais acrescenta ? em cada campo. Se a raiz é um array e a algum objeto falta uma chave, esse campo é opcional mesmo com Propriedades opcionais desligado. export escreve export interface. Uma raiz que é array acrescenta o comentário // JSON root is Nome[].

O SQL põe Nome em minúsculas e converte os outros caracteres em sublinhados, por isso Order Line passa a order_line. Os inteiros são BIGINT, os outros números são DOUBLE, os booleanos são BOOLEAN e escrevem-se como 1 ou 0, e as cadeias são TEXT. Um objeto ou um array aninhado é TEXT com o texto JSON. Uma aspa simples dentro de uma cadeia é dobrada. Uma chave que é null, ou que falta em alguma linha, aceita NULL. Cada objeto é um INSERT.

Quando usar

  • Esboçar uma interface TypeScript a partir de uma amostra de API.
  • Carregar um array JSON quando os campos aninhados podem ficar como texto JSON.
  • Conferir que uma aspa dentro de um nome fica guardada como duas aspas.

Perguntas

Por que meta é uma segunda interface?

É um objeto, por isso TypeScript chama-lhe ItemMeta. No SQL esse mesmo campo é TEXT com {"n":2}.

Por que um array de números falhou?

Cada objeto vira uma linha. Um array de números não tem colunas.