JSON → Elixir Ecto
Elixir & Phoenix Code Generation

Générateur de Schémas Ecto et Changesets Elixir depuis JSON

Guide architectural et référence de configuration pour compiler des données JSON brutes en schémas Elixir Ecto de production, migrations, changesets et typespecs Dialyzer.

Confidentialité 100% côté client
Zéro transmission au serveur
Préréglages :
Ecto Architecture & Compiler Options
Charge utile JSON entrante
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
Types Ecto détectés
13 Attributes
PK: binary_id • Timestamps: utc_datetime
Changeset Cast & Embeds
3 Embedded Schemas
Strategy: embeds
Statut DDL Base de données
table(:orders)
PostgreSQL & MySQL Migration Ready

Générateur 100% privé côté client

Aucun téléversement sur serveur ni télémétrie. Vos charges utiles JSON, schémas internes et structures de données sont traités exclusivement dans la mémoire du navigateur.

Architecture idiomatique Phoenix & Ecto

Génère des schémas Ecto 3.x standard avec @derive {Jason.Encoder}, embedded_schema, changesets cast/validate, contraintes regex et horodatages.

Génération complète de la pile

Génération instantanée de schémas Ecto, schémas embarqués, migrations de base de données, spécifications @type Dialyzer et fonctions CRUD de contexte Phoenix.

Référence technique et guide d'architecture

Json To Elixir Ecto Référence Développeur — Guide de référence

Guide architectural et référence de configuration pour compiler des données JSON brutes en schémas Elixir Ecto de production, migrations, changesets et typespecs Dialyzer.

Paramètres clés et contrôles

schemaMode'table' | 'embedded'

Bascule entre les schémas relationnels adossés à des tables via Ecto.Schema et les modèles basés sur des structures sans état via embedded_schema.

Par défaut : 'table'
primaryKey'binary_id' | 'id' | 'none'

Configure la clé primaire de l'entité racine, générant @primary_key {:id, :binary_id, autogenerate: true} pour UUIDs, entiers auto-incrémentés ou clé désactivée.

Par défaut : 'binary_id'
nestedStrategy'embeds' | 'map'

Détermine si les objets JSON imbriqués sont décomposés en sous-schémas embeds_one/embeds_many ou stockés sous forme de types :map sans schéma.

Par défaut : 'embeds'
timestamps'utc_datetime' | 'naive_datetime' | 'none'

Génère les macros d'horodatage Ecto configurées pour une précision microseconde UTC, les horodatages natifs sans fuseau, ou supprime les horodatages.

Par défaut : 'utc_datetime'
smartValidationsboolean

Analyse les valeurs échantillons pour injecter automatiquement validate_format/3 (e-mails, UUIDs, URLs) et validate_number/3 dans les pipelines de changeset.

Par défaut : true
deriveJasonboolean

Insère @derive {Jason.Encoder, only: [...]} au-dessus de la définition du schéma pour permettre une sérialisation JSON sécurisée dans les vues Phoenix.

Par défaut : true

Conseils de pro et bonnes practices

Forcer la précision UTC Datetime

Privilégiez systématiquement :utc_datetime à :naive_datetime lors de l'ingestion de payloads JSON pour éliminer les dérives de fuseaux horaires et garantir la compatibilité PostgreSQL timestamptz.

Découpler les Changesets imbriqués

Avec la stratégie d'embeds, isolez les règles de validation enfants dans des fonctions ou modules dédiés passés via l'option :with de cast_embed/3 afin d'éviter la saturation du changeset racine.

Restreindre la sérialisation Jason

Renseignez impérativement la liste explicite :only dans @derive Jason.Encoder au lieu de sérialiser l'intégralité de la structure, empêchant la fuite de champs virtuels ou d'attributs sensibles.

Pièges courants et dépannage

Erreur Changeset 'is invalid' lors de la transmission d'une valeur null à un embed

Ecto rejette par défaut les valeurs nulles pour les sous-schémas requis. Définissez required: false dans cast_embed/3 ou configurez une structure par défaut dans le schéma parent pour absorber les valeurs nulles.

Échec de migration PostgreSQL dû à une divergence de type de clé étrangère (erreur 42804)

Lorsque vous utilisez binary_id comme clé primaire, veillez à ce que la migration spécifie explicitement type: :binary_id dans les références (ex. references(:users, type: :binary_id)).

Foire aux questions (FAQ)

Le payload JSON est-il transmis à des serveurs tiers pour traitement ?▼

Non. L'analyse syntaxique du JSON, l'inférence des types et la génération du code AST Elixir s'exécutent intégralement côté client dans le moteur JavaScript de votre navigateur. Aucune donnée ne quitte votre machine.

Comment le générateur différencie-t-il les types string, date et utc_datetime ?▼

Les valeurs textuelles sont validées par des expressions régulières conformes au standard RFC 3339 / ISO-8601. Les horodatages complets avec fuseau deviennent des :utc_datetime, les dates simples des :date, et le texte libre reste :string.

Comment sont gérés les tableaux JSON contenant des types primitifs hétérogènes ?▼

Ecto imposant des tableaux strictement typés ({:array, :type}), les listes composites basculent automatiquement vers {:array, :map} ou un type :map générique afin de préserver la validation Dialyzer sans erreur à l'exécution.

Pourquoi des scripts de migration sont-ils générés conjointement aux schémas Ecto ?▼

Ecto dissocie la modélisation en mémoire applicative (Ecto.Schema) de la structure relationnelle DDL (Ecto.Migration). Produire les deux conjointement garantit une stricte cohérence entre la base de données et votre code métier.

Outils et utilitaires connexes

Tous les outils →