---
title: "json"
image: "https://adonia.pages.dev/og.png"
version: "next"
---

> Documentation Index
> Fetch the complete documentation index at: https://adonia.pages.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# json

<!-- Generated by `pnpm docs:fields` from packages/core/src/schema/fields/json_field.ts. Edit the TSDoc, not this file. -->

Arbitrary JSON document, edited as code and stored parsed.

**Form state is the PARSED value, not its text.** The editor round-trips
the document through `JSON.parse`/`JSON.stringify` client-side, and the
state that reaches the wire is the value itself.

A STRING is treated as a serialized document on BOTH sides — parsed on
dehydrate (some editors submit their buffer verbatim) and on hydrate
(MySQL and SQLite hand back `json` columns as text). The symmetry has one
casualty: a document whose top-level value is itself a string is not
representable, because storing it would make the next read parse it
again. Columns that hold free text are `F.code` or `F.textarea`, not
`F.json`.

| | |
| --- | --- |
| Builder | `F.json(attribute: string): JsonField` |
| Wire type key | `json` |
| Class chain | `JsonField` → `Field` |
| Detail projection | `code-entry` |
| Column counterpart | — *(not tabulatable)* |

## Example

```ts
import { F } from '@adonia/core'

F.json('settings')
  .label('Settings')
  .rows(12)
  .rules((v) => v.object({ theme: v.enum(['light', 'dark']) }))
```

## Props

Beyond the shared [field DSL](/reference/fields#the-shared-field-dsl):

| Prop | Declared on | Behaviour |
| --- | --- | --- |
| `rows(count: number): this` | `JsonField` | Initial editor height in rows; the client's default applies when unset. |
| `prettify(enabled = true): this` | `JsonField` | Whether the editor re-indents the document on load (default `true`). `prettify(false)` preserves whatever formatting the stored text had, which matters for documents a human maintains by hand. |

## Validation

Vine base: `vine.any()`.

§11.1 mapping: `vine.any()`.

The row is intentionally permissive — see the module note. A `rules()`
override replaces this base entirely (handled by
`Field.buildValidation`), which is the documented way to
schema-check a `json` field.

Contributed by `JsonField.vineSchema()` in `packages/core/src/schema/fields/json_field.ts`. The shared modifiers (`required`, `nullable`, `requiredWhen`, `unique`, optionality) are applied on top by `Field.buildValidation`, and a `rules()` override replaces the base entirely — the validator compiler never branches on the field class.

## Declared in

- `packages/core/src/schema/fields/json_field.ts` — `JsonField`

Source: https://adonia.pages.dev/reference/fields/json/index.mdx
