JSON → Elixir Ecto
Elixir & Phoenix Code Generation

JSON zu Elixir Ecto Schema & Changeset Generator

Architektur- und Konfigurationsleitfaden für die Kompilierung von JSON-Nutzdaten in produktionsreife Elixir-Ecto-Schemas, Migrationen, Changesets und Dialyzer-Typespecs.

100% clientseitige Privatsphäre
Null Serverübertragung
Voreinstellungen:
Ecto Architecture & Compiler Options
Eingabe-JSON-Payload
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
Erkannte Ecto-Typen
13 Attributes
PK: binary_id • Timestamps: utc_datetime
Changeset Cast & Embeds
3 Embedded Schemas
Strategy: embeds
Datenbank-DDL-Status
table(:orders)
PostgreSQL & MySQL Migration Ready

100% Client-seitiger privater Generator

Keine Server-Uploads oder Telemetrie. Ihre JSON-Nutzdaten, internen Schemas und Datenstrukturen werden ausschließlich im Browser-Speicher verarbeitet.

Idiomatische Phoenix- & Ecto-Architektur

Erstellt standardkonforme Ecto 3.x-Schemas mit @derive {Jason.Encoder}, embedded_schema, cast/validate Changesets, Validierungsregeln und Timestamps.

Vollständige Stack-Generierung

Sofortige Erstellung von Ecto-Schemas, eingebetteten Schemas, Datenbankmigrationen, Dialyzer @type-Spezifikationen und Phoenix-Context-CRUD-Funktionen.

Technische Referenz & Architektur-Leitfaden

Json To Elixir Ecto Entwickler-Referenz — Referenz-Leitfaden

Architektur- und Konfigurationsleitfaden für die Kompilierung von JSON-Nutzdaten in produktionsreife Elixir-Ecto-Schemas, Migrationen, Changesets und Dialyzer-Typespecs.

Wichtige Parameter & Steuerelemente

schemaMode'table' | 'embedded'

Wechselt zwischen relationalen Datenbank-Tabellenschemas via Ecto.Schema und zustandslosen strukturbasierten Schemas via embedded_schema.

Standard: 'table'
primaryKey'binary_id' | 'id' | 'none'

Konfiguriert den Primärschlüsseltyp der Wurzelentität, definiert @primary_key {:id, :binary_id, autogenerate: true} für UUIDs, Integer oder deaktiviert ihn.

Standard: 'binary_id'
nestedStrategy'embeds' | 'map'

Bestimmt, ob verschachtelte JSON-Objekte als rekursive embeds_one/embeds_many-Subschemas dekonstruiert oder als schemalose :map-Typen abgelegt werden.

Standard: 'embeds'
timestamps'utc_datetime' | 'naive_datetime' | 'none'

Generiert Ecto-Timestamp-Makros für mikrosekundengenaue UTC-Datumsangaben, veraltete naive Datumsangaben oder schließt Zeitstempel komplett aus.

Standard: 'utc_datetime'
smartValidationsboolean

Analysiert Beispielwerte und integriert validate_format/3 (E-Mails, UUIDs, URLs) sowie validate_number/3 direkt in die generierten Changeset-Pipelines.

Standard: true
deriveJasonboolean

Fügt @derive {Jason.Encoder, only: [...]} über dem Schema ein, um eine deterministische JSON-Serialisierung in Phoenix-Views und API-Antworten zu gewährleisten.

Standard: true

Profi-Tipps & Best Practices

UTC-Präzision erzwingen

Verwenden Sie bei JSON-API-Payloads stets :utc_datetime anstelle von :naive_datetime, um Zeitzonendrifts zu vermeiden und volle Kompatibilität mit PostgreSQL timestamptz zu sichern.

Verschachtelte Embeds trennen

Trennen Sie bei der Embed-Strategie die Validierungslogik in separate Modulfunktionen aus und übergeben Sie diese via :with an cast_embed/3, um überladene Root-Changesets zu vermeiden.

Jason-Encoder-Felder sichern

Definieren Sie in @derive Jason.Encoder stets eine explizite :only-Liste anstelle vollständiger Structs, um das ungewollte Offenlegen interner virtueller Felder oder Geheimnisse zu verhindern.

Häufige Fallstricke & Fehlerbehebung

Changeset-Fehler 'is invalid' beim Verarbeiten von Null-Werten in eingebetteten Objekten

Ecto blockiert Null-Werte bei erforderlichen Embedded-Schemas. Konfigurieren Sie required: false in cast_embed/3 oder hinterlegen Sie Standard-Structs im Parents-Schema, um Null-Payloads abzufangen.

PostgreSQL-Migrationsfehler aufgrund inkompatibler Fremdschlüssel-Typen (Fehler 42804)

Wenn Sie binary_id für Primärschlüssel nutzen, müssen Fremdschlüssel-Referenzen in der Migration explizit mit type: :binary_id definiert werden (z. B. references(:users, type: :binary_id)).

Häufig gestellte Fragen (FAQ)

Werden eingegebene JSON-Daten zur Analyse an externe Server übertragen?▼

Nein. Sämtliches JSON-Parsing, die Typerkennung und die Elixir-Code-Generierung finden vollständig clientseitig in der JavaScript-Laufzeit Ihres Browsers statt. Keine Daten oder Tokens verlassen Ihr System.

Wie differenziert das Tool zwischen String-, Date- und utc_datetime-Typen?▼

Werte werden gegen strikte RFC 3339 / ISO-8601-RegEx-Muster geprüft. Vollständige Zeitstempel mit Zeitzonenversatz werden als :utc_datetime typisiert, reine Kalenderdaten als :date und sonstiger Text als :string.

Wie verarbeitet der Generator Arrays mit uneinheitlichen Datentypen?▼

Da Ecto strikte Primitiv-Arrays ({:array, :type}) erfordert, fallen heterogene Listen automatisch auf {:array, :map} oder den universellen :map-Typ zurück, um Typkonflikte unter Dialyzer zu verhindern.

Warum werden neben den Ecto-Schemas auch separate Datenbankmigrationen erstellt?▼

Ecto trennt strikt zwischen Anwendungsstrukturen im Speicher (Ecto.Schema) und DDL-Datenbankoperationen (Ecto.Migration). Die simultane Erzeugung garantiert konsistente Spaltentypen und Integritätsregeln auf beiden Ebenen.

Verwandte Werkzeuge & Dienstprogramme

Alle Werkzeuge →