JSON → Elixir Ecto
Elixir & Phoenix Code Generation

Gerador de Esquemas Ecto e Changesets de Elixir a partir de JSON

Guia técnico e de configuração arquitetural para compilar payloads JSON brutos em esquemas Elixir Ecto de produção, migrações, changesets e typespecs do Dialyzer.

Privacidade 100% no cliente
Zero transmissão ao servidor
Predefinições:
Ecto Architecture & Compiler Options
Carga Útil JSON de Entrada
defmodule MyApp.Orders.Order do
  @moduledoc """
  Ecto schema for `orders`.
  Generated automatically with ToolsAA 100% Client-Side Engine.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id
  @derive {Jason.Encoder, only: [:id, :order_id, :order_number, :customer, :shipping_address, :items, :subtotal, :tax_amount, :total_amount, :currency, :is_fulfilled, :payment_status, :notes, :placed_at]}

  @type t :: %__MODULE__{}

  schema "orders" do
    field :order_id, :binary_id
    field :order_number, :string
    embeds_one :customer, MyApp.Orders.Order.Customer, on_replace: :update
    embeds_one :shipping_address, MyApp.Orders.Order.ShippingAddress, on_replace: :update
    embeds_many :items, MyApp.Orders.Order.Item, on_replace: :delete
    field :subtotal, :float
    field :tax_amount, :float
    field :total_amount, :float
    field :currency, :string
    field :is_fulfilled, :boolean
    field :payment_status, :string
    field :notes, :string
    field :placed_at, :utc_datetime

    timestamps(type: :utc_datetime)
  end

  @required_fields [:order_id, :order_number, :subtotal, :tax_amount, :total_amount, :currency, :payment_status, :placed_at]
  @optional_fields [:is_fulfilled, :notes]

  @doc false
  def changeset(model, attrs) do
    model
    |> cast(attrs, @required_fields ++ @optional_fields)
    |> validate_required(@required_fields)
    |> validate_format(:order_id, ~r/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i, message: "must be a valid UUID")
    |> validate_number(:subtotal, greater_than_or_equal_to: 0)
    |> validate_number(:tax_amount, greater_than_or_equal_to: 0)
    |> validate_number(:total_amount, greater_than_or_equal_to: 0)
    |> cast_embed(:customer, required: true)
    |> cast_embed(:shipping_address, required: true)
    |> cast_embed(:items)
  end
end

defmodule MyApp.Orders.Order.Customer do
  @moduledoc """
  Embedded schema representing `MyApp.Orders.Order.Customer`.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @derive {Jason.Encoder, only: [:customer_id, :full_name, :email, :phone_number, :is_vip]}
  @primary_key false
  embedded_schema do
    field :customer_id, :string
    field :full_name, :string
    field :email, :string
    field :phone_number, :string
    field :is_vip, :boolean
  end

  @doc false
  def changeset(struct_or_changeset, attrs) do
    struct_or_changeset
    |> cast(attrs, [:customer_id, :full_name, :email, :phone_number, :is_vip])
    |> validate_required([:customer_id, :full_name, :email, :phone_number])
    |> validate_format(:email, ~r/^[^s]+@[^s]+$/, message: "must have the @ sign and no spaces")
  end
end

defmodule MyApp.Orders.Order.ShippingAddress do
  @moduledoc """
  Embedded schema representing `MyApp.Orders.Order.ShippingAddress`.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @derive {Jason.Encoder, only: [:street, :city, :state, :postal_code, :country_code]}
  @primary_key false
  embedded_schema do
    field :street, :string
    field :city, :string
    field :state, :string
    field :postal_code, :string
    field :country_code, :string
  end

  @doc false
  def changeset(struct_or_changeset, attrs) do
    struct_or_changeset
    |> cast(attrs, [:street, :city, :state, :postal_code, :country_code])
    |> validate_required([:street, :city, :state, :postal_code, :country_code])
  end
end

defmodule MyApp.Orders.Order.Item do
  @moduledoc """
  Embedded schema representing `MyApp.Orders.Order.Item`.
  """
  use Ecto.Schema
  import Ecto.Changeset

  @derive {Jason.Encoder, only: [:sku, :title, :quantity, :unit_price, :discount_rate, :in_stock]}
  @primary_key false
  embedded_schema do
    field :sku, :string
    field :title, :string
    field :quantity, :integer
    field :unit_price, :float
    field :discount_rate, :float
    field :in_stock, :boolean
  end

  @doc false
  def changeset(struct_or_changeset, attrs) do
    struct_or_changeset
    |> cast(attrs, [:sku, :title, :quantity, :unit_price, :discount_rate, :in_stock])
    |> validate_required([:sku, :title, :quantity, :unit_price, :discount_rate])
    |> validate_number(:quantity, greater_than_or_equal_to: 0)
    |> validate_number(:unit_price, greater_than_or_equal_to: 0)
    |> validate_number(:discount_rate, greater_than_or_equal_to: 0)
  end
end
Tipos Ecto Detectados
13 Attributes
PK: binary_id • Timestamps: utc_datetime
Changeset Cast & Incorporações
3 Embedded Schemas
Strategy: embeds
Status DDL do Banco
table(:orders)
PostgreSQL & MySQL Migration Ready

Gerador 100% Privado no Cliente

Zero uploads para servidores ou telemetria. Suas cargas JSON, esquemas internos e estruturas de dados proprietárias são processados estritamente na memória do navegador.

Arquitetura Idiomática do Phoenix e Ecto

Gera esquemas padrão do Ecto 3.x com @derive {Jason.Encoder}, embedded_schema, changesets cast/validate, regras de validação e timestamps.

Geração Completa para a Aplicação

Geração instantânea de esquemas Ecto, esquemas incorporados, migrações de banco de dados, especificações Dialyzer @type e funções CRUD de Contexto Phoenix.

Referência técnica e guia de arquitetura

Json To Elixir Ecto Referência para Desenvolvedores — Guia de referência

Guia técnico e de configuração arquitetural para compilar payloads JSON brutos em esquemas Elixir Ecto de produção, migrações, changesets e typespecs do Dialyzer.

Parâmetros principais e controles

schemaMode'table' | 'embedded'

Alterna entre esquemas relacionais vinculados a tabelas via Ecto.Schema e esquemas desacoplados baseados em structs via embedded_schema.

Padrão: 'table'
primaryKey'binary_id' | 'id' | 'none'

Configura a chave primária da entidade, definindo @primary_key {:id, :binary_id, autogenerate: true} para UUIDs, inteiros incrementais ou desativação total.

Padrão: 'binary_id'
nestedStrategy'embeds' | 'map'

Determina se objetos JSON aninhados são estruturados em subesquemas embeds_one/embeds_many ou armazenados como campos :map genéricos sem esquema.

Padrão: 'embeds'
timestamps'utc_datetime' | 'naive_datetime' | 'none'

Gera macros de timestamp do Ecto com precisão UTC em microssegundos, datas ingênuas legadas ou exclui timestamps completamente.

Padrão: 'utc_datetime'
smartValidationsboolean

Avalia valores de exemplo para injetar validadores validate_format/3 (e-mails, UUIDs, URLs) e validate_number/3 diretamente nas pipelines de changeset.

Padrão: true
deriveJasonboolean

Insere @derive {Jason.Encoder, only: [...]} acima do esquema para permitir serialização JSON segura em views e controllers do Phoenix.

Padrão: true

Dicas profissionais e melhores práticas

Forçar precisão UTC Datetime

Prefira sempre :utc_datetime a :naive_datetime ao lidar com payloads de APIs JSON para evitar desvios de fuso horário e assegurar compatibilidade perfeita com o tipo timestamptz do PostgreSQL.

Desacoplar Changesets Embutidos

Ao utilizar a estratégia de embeds, isole a validação dos nós filhos em funções ou módulos separados via opção :with de cast_embed/3, evitando a sobrecarga do changeset principal.

Restringir serialização Jason

Especifique campos explicitamente no parâmetro :only de @derive Jason.Encoder em vez de serializar a struct inteira, evitando vazamento acidental de chaves virtuais e dados sensíveis.

Problemas comuns e solução de problemas

Erro de Changeset 'is invalid' ao receber valores nulos em objetos embutidos

O Ecto rejeita valores nulos em esquemas embutidos obrigatórios. Defina required: false em cast_embed/3 ou configure uma struct padrão no esquema pai para suportar payloads nulos com segurança.

Falha de migração no PostgreSQL por incompatibilidade de chave estrangeira (código 42804)

Ao utilizar chaves primárias do tipo binary_id, garanta que as referências na migração definam explicitamente type: :binary_id (ex: references(:users, type: :binary_id)).

Perguntas frequentes (FAQ)

Os dados JSON inseridos são enviados a servidores externos para análise?▼

Não. Todo o parsing de JSON, a inferência de tipos e a compilação de código Elixir ocorrem estritamente no runtime JavaScript do seu navegador. Nenhum dado de produção ou credencial sai do seu dispositivo.

Como o utilitário diferencia entre os tipos string, date e utc_datetime?▼

Os valores são checados contra expressões regulares em conformidade com o RFC 3339 / ISO-8601. Strings com fuso horário tornam-se :utc_datetime, datas puras tornam-se :date e demais textos viram :string.

Como o gerador trata arrays com tipos heterogêneos de dados primitivos?▼

Como o Ecto impõe tipagem estrita para arrays ({:array, :tipo}), listas heterogêneas sofrem fallback automático para {:array, :map} ou para o tipo genérico :map, prevenindo falhas no Dialyzer.

Por que scripts de migração são gerados paralelamente aos esquemas Ecto?▼

O Ecto isola definições de structs em memória (Ecto.Schema) de operações DDL de banco de dados (Ecto.Migration). Criar ambos em conjunto garante paridade de tipos de coluna e regras de integridade.

Ferramentas e utilitários relacionados

Todas as ferramentas →