Przejdź do treści

Konwerter JSON Schema na schemat Zod — Numio

Generuje kod walidacji Zod z JSON Schema przy użyciu json-schema-to-zod. Ograniczenia minLength, minimum, pattern i default stają się łańcuchami metod Zod, a właściwości niewymienione w "required" otrzymują .optional().

Otrzymujesz schemat JSON od innego zespołu i chcesz sprawdzić poprawność środowiska wykonawczego w usłudze TypeScript bez walidatora schematu JSON.

JSON Schema

Zod Schema

Kiedy go używać

  • Otrzymujesz schemat JSON od innego zespołu i chcesz sprawdzić poprawność środowiska wykonawczego w usłudze TypeScript bez walidatora schematu JSON.
  • Przenosisz weryfikację formularza z walidatora schematu JSON, takiego jak Ajv, do Zoda i chcesz zacząć od wygenerowanego kodu.

Jak używać

  1. Wklej schemat JSON do panelu schematu JSON.
  2. Opcjonalnie otwórz ustawienia i zmień nazwę schematu głównego (domyślnie "schema"); zostanie ona nazwą eksportowanej stałej const.
  3. Skopiuj wygenerowany kod, który importuje z z „zod”, do swojego projektu. Konwersja przebiega w przeglądarce.

Schemat JSON

{
  "type": "object",
  "properties": {
    "username": { "type": "string", "minLength": 3, "maxLength": 20 },
    "age": { "type": "integer", "minimum": 18 },
    "contact": {
      "oneOf": [
        { "type": "string", "format": "email" },
        { "type": "string", "pattern": "^\\+[0-9]+$" }
      ]
    },
    "newsletter": { "type": "boolean", "default": false }
  },
  "required": ["username", "contact"]
}

Schemat Zoda

import { z } from "zod"

export const schema = z.object({
  username: z.string().min(3).max(20),
  age: z.number().int().gte(18).optional(),
  contact: z.any().superRefine((x, ctx) => {
    const schemas = [
      z.string().email(),
      z.string().regex(new RegExp("^\\+[0-9]+$")),
    ]
    const errors = schemas.reduce(
      (errors: z.ZodError[], schema) =>
        ((result) => ("error" in result ? [...errors, result.error] : errors))(
          schema.safeParse(x),
        ),
      [],
    )
    if (schemas.length - errors.length !== 1) {
      ctx.addIssue({
        path: ctx.path,
        code: "invalid_union",
        unionErrors: errors,
        message: "Invalid input: Should pass single schema",
      })
…

Szczegóły i ograniczenia

oneOf jest konwertowany do z.any().superRefine(...), który sprawdza, czy dokładnie jeden podschemat przeszedł, jak pokazano w przykładzie.

$ref nie został rozwiązany: właściwość, do której się odwołuje, staje się z.any().

integer dodaje .int(), format "email" dodaje .email(), a format "date-time" dodaje .datetime().

additionalProperties: false staje się .catchall(z.never()) zamiast .strict().

FAQ

Jak obsługiwane są typy dopuszczające wartość null?

„type”: [„string”, „null”] zmienia się na z.union([z.string(), z.null()]), z dodaną opcją .opcjonalne(), jeśli właściwość nie jest wymagana.

Czy mogę zmienić nazwę wyeksportowanego schematu?

Tak. Ustaw nazwę schematu głównego w ustawieniach; wynik będzie miał postać export const <name> = ... zamiast export const schema.

Czy obsługiwane są definicje i $ref?

Nie. Właściwość korzystająca z $ref staje się z.any(), dlatego przed konwersją wstaw przywoływany schemat.

Specyfikacje i referencje