100 % local — vos données ne quittent jamais votre navigateur

JSON en Zod — validez à la frontière

Transformez un échantillon JSON en schémas Zod. Un schéma par objet, déclaré avant usage, et z.infer vous donne le type TypeScript depuis la même source.

Instantané Privé Zéro cookie

Entrée JSON

Sortie Zod

Ce que fait cet outil

Un échantillon JSON devient des schémas Zod, un const par objet.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import { z } from "zod";

export const AddressSchema = z.object({
  city: z.string(),
});

export const RootSchema = z.object({
  id: z.int(),
  name: z.string(),
  address: AddressSchema,
});

Les enfants viennent d’abord : ce sont des constantes d’exécution, et un schéma doit exister avant qu’un autre le mentionne.

Les nombres sont lus tels qu’ils sont écrits

z.int() pour un entier, z.number() pour tout ce qui porte un point décimal ou un exposant :

{ "price": 10.0, "quantity": 3 }
price: z.number(),
quantity: z.int(),

Jusqu’à peu, price sortait en z.int() : 10.0 s’analyse en un nombre entier et rien ne conservait le littéral. Le schéma refusait alors 10.5 — l’enregistrement suivant, très probablement. JSON n’a qu’un type numérique : la forme écrite est le seul témoignage de ce que voulait le producteur, et la conversion la lit désormais. Le défaut a été trouvé en écrivant cette page, puis corrigé.

Syntaxe Zod 4

z.int() est l’écriture de Zod 4. En Zod 3, écrivez z.number().int() ; rien d’autre ne diffère entre les deux versions dans cette sortie.

Ce qu’un échantillon ne peut pas décider pour vous

  • Rien n’est .optional(). Une clé vue une fois peut apparaître ; savoir si elle apparaît toujours n’est pas dans le document.
  • null donne z.null(), un schéma qui n’accepte rien d’autre. Si le champ est « une chaîne, parfois absente », le .nullable() vous revient.
  • Les clés inconnues sont retirées, pas refusées, parce que c’est le défaut de Zod. .strict() est une décision sur votre API.
  • Un tableau hétérogène devient une union : [1, "a"] donne z.array(z.union([z.int(), z.string()])), ce qui décrit exactement l’échantillon et sera peut-être plus large que vos données réelles.

Chacun de ces points est un endroit où le schéma engendré n’est qu’un point de départ, et la page le dit plutôt que de vous le laisser découvrir en revue.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi `10.0` donne-t-il `z.number()` et `3` un `z.int()` ?
Parce que c’est ainsi qu’ils sont écrits. JSON n’a qu’un type numérique : le seul indice sur l’original est le littéral, où un point décimal ou un exposant trahit un flottant. `10.0` sortait en `z.int()`, et le schéma refusait alors 10.5 — l’enregistrement suivant. C’était un vrai défaut, corrigé.
`z.int()` existe-t-il en Zod 3 ?
Non, il est arrivé avec Zod 4. En version 3, la même chose s’écrit `z.number().int()`, et un remplacement suffit. Tout le reste de la sortie — `z.object`, `z.array`, `z.union`, `z.null` — est identique entre les deux versions.
Le schéma refuse-t-il les clés inconnues ?
Non. `z.object()` retire ce qu’il ne connaît pas au lieu d’échouer : c’est le défaut de Zod, et il est conservé ici. Si une clé en trop doit être une erreur, ajoutez `.strict()` vous-même — c’est une décision sur votre API, pas quelque chose qu’un échantillon puisse nous dire.

Convertisseurs associés