{0 JSON derivation}

The [js_of_ocaml-ppx_deriving_json] package provides a PPX deriver for
serializing OCaml values to JSON.

{b Important}: The serialization format follows js_of_ocaml's
{{!page-"runtime-representation"}internal representation}.
It is designed for communication between a js_of_ocaml program and a server-side
OCaml application, not for interacting with third-party APIs.

{1:installation Installation}

{v
opam install js_of_ocaml-ppx_deriving_json
v}

{1:usage Usage}

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

{@ocaml[
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)

{b 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:

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

{1:supported-types 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

{1 See also}

- {{!page-"javascript-interop".json}JSON serialization} — Direct JSON output
