## Installation

    opam install js_of_ocaml-ppx_deriving_json

## Usage

Add `[@@deriving json]` to your type definitions:

    type person = {
      name : string;
      age : int;
    }
    [@@deriving json]

    (* Serialize to a JSON string *)
    let json_str = Deriving_Json.to_string person_json { name = "Alice"; age = 30 }

    (* Deserialize from a JSON string *)
    let alice = Deriving_Json.from_string person_json json_str

The `[@@deriving json]` attribute generates:

- `person_to_json : Buffer.t -> person -> unit` — write a value to a buffer
- `person_of_json : Deriving_Json_lexer.lexbuf -> person` — read a value from a lexer buffer
- `person_json : person Deriving_Json.t` — a witness, usable with `Deriving_Json.to_string` and `Deriving_Json.from_string` for string conversion (as in the example above)

Note: For types named `t`, the prefix is omitted (e.g., `of_json` instead of `t_of_json`).

The `[%to_json: type]` and `[%of_json: type]` syntax also works with any type expression:

    let json = [%to_json: int list] [1; 2; 3]
    let nums = [%of_json: int list] json

## Supported types

The deriver supports:

- Basic types: `int`, `float`, `string`, `bool`
- Options: `'a option`
- Lists and arrays: `'a list`, `'a array`
- Records and variants
- Polymorphic variants
- Recursive types

## See also

- JSON serialization — Direct JSON output