package ocplib-json-typed
Install
Dune Dependency
Authors
Maintainers
Sources
md5=afa5aed32fcd7ff3ffae7c0adfb5de58
sha512=e564518999e3b88c4d734d783ba4ea3bdcf7c2b6f408db70d662a989e97a50192ef1c75ad9621505779609372bce0e765a5ceb4536a24c66deb359c37fc967f8
doc/ocplib-json-typed/Json_encoding/index.html
Module Json_encoding
Source
JSON structure description using dependently typed combinators.
Dependent types describing JSON document structures
An encoding between an OCaml data type (the parameter) and a JSON representation. To be built using the predefined combinators provided by this module.
For instance, here is an encoding, of type (int * string) encoding
, mapping values of type int * string
to JSON objects with a field code
of whose value is a number and a field message
whose value is a string.
let enc = obj2 (req "code" int) (req "message" string)
This encoding serves three purposes:
1. Output an OCaml value of type 'a
to an intermediate JSON representation using construct
. To be printed to actual JSON using an external library. 2. Input a JSON intermediate structure (already parsed with an external library) to produce an OCaml value of type 'a
. 3. Describe this encoding in JSON-schema format for inter-operability: you describe the encoding of your internal types, and obtain machine-readable descriptions of the formats as a byproduct. Specific documentation combinators are provided for that purpose.
By default, this library provides functions that work on the Json_repr.ezjsonm
data type, compatible with Ezjsonm.value
. However, encodings are not tied with this representation. See functor Make
and module Json_repr
for using another format.
Constructors and destructors for Json_repr.ezjsonm
Builds a json value from an OCaml value and an encoding.
This function works with JSON data represented in the Json_repr.ezjsonm
format. See functor Make
for using another representation.
Reads an OCaml value from a JSON value and an encoding. May raise Cannot_destruct
.
This function works with JSON data represented in the Json_repr.ezjsonm
format. See functor Make
for using another representation.
JSON type combinators for simple immediates
An encoding of an OCaml int by a JSON number.
When destructing, the JSON number cannot have a fractional part, and must be between -2^30
and 2^30-1
(these bounds are chosen to be compatible with both 32-bit and 64bit native OCaml compilers as well as JavaScript). When constructing, the value coming from the OCaml world is assumed to be valid, otherwise an Invalid_argument
will be raised (can only happen on 64-bit systems).
Use int32
or int53
for a greater range. Use ranged_int
to restrict to an interval.
An encoding of an OCaml int32 by a JSON number.
Must be a floating point without fractional part and between -2^31
and 2^31-1
when destructing. Never fails when constructing, as all 32-bit integers are included in JSON numbers.
An encoding of a JSON-representable OCaml int64 by a JSON number.
Restricted to the -2^53
to 2^53
range, as this is the limit of representable integers in JSON numbers. Must be a floating point without fractional part and in this range when destructing. When constructing, the value coming from the OCaml world is assumed to be in this range, otherwise an Invalid_argument
will be raised.
An encoding of an OCaml int by a JSON number restricted to a specific range.
The bounds must be between -2^30
and 2^30-1
.
The inclusive bounds are checked when destructing. When constructing, the value coming from the OCaml world is assumed to be within the bounds, otherwise an Invalid_argument
will be raised. The string parameter is a name used to tweak the error messages.
An encoding of an OCaml int32 by a JSON number restricted to a specific range.
The bounds must be between -2^31
and 2^31-1
.
The inclusive bounds are checked when destructing. When constructing, the value coming from the OCaml world is assumed to be within the bounds, otherwise an Invalid_argument
will be raised. The string parameter is a name used to tweak the error messages.
An encoding of an OCaml int64 by a JSON number restricted to a specific range.
The bounds must be between -2^53
and 2^53
.
The inclusive bounds are checked when destructing. When constructing, the value coming from the OCaml world is assumed to be within the bounds, otherwise an Invalid_argument
will be raised. The string parameter is a name used to tweak the error messages.
An encoding of a closed set of OCaml values by JSON strings.
An encoding of an OCaml float by a JSON number with range constraints
An encoding of an OCaml option by a nullable JSON value. Raises Invalid_argument
when nesting options – i.e., when building 'a option option encoding
. Also raises Invalid_argument
when used on the encoding of null
.
JSON type combinators for objects
A first class handle to a JSON field.
A required field of a given its type.
An optional field of a given type, using an OCaml option
.
An optional field of a given type, ommited when equal to a default value.
An encoding of an OCaml pair by a JSON object with two fields.
An encoding of an OCaml triple by a JSON object with three fields.
val obj4 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
('f1 * 'f2 * 'f3 * 'f4) encoding
An encoding of an OCaml quadruple by a JSON object with four fields.
val obj5 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
'f5 field ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5) encoding
An encoding of an OCaml quintuple by a JSON object with five fields.
val obj6 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
'f5 field ->
'f6 field ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6) encoding
An encoding of an OCaml sextuple by a JSON object with six fields.
val obj7 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
'f5 field ->
'f6 field ->
'f7 field ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7) encoding
An encoding of an OCaml septuple by a JSON object with seven fields.
val obj8 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
'f5 field ->
'f6 field ->
'f7 field ->
'f8 field ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7 * 'f8) encoding
An encoding of an OCaml octuple by a JSON object with eight fields.
val obj9 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
'f5 field ->
'f6 field ->
'f7 field ->
'f8 field ->
'f9 field ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7 * 'f8 * 'f9) encoding
An encoding of an OCaml nonuple by a JSON object with nine fields.
val obj10 :
'f1 field ->
'f2 field ->
'f3 field ->
'f4 field ->
'f5 field ->
'f6 field ->
'f7 field ->
'f8 field ->
'f9 field ->
'f10 field ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7 * 'f8 * 'f9 * 'f10) encoding
An encoding of an OCaml decuple by a JSON object with ten fields.
JSON type combinators for arrays
An encoding of an OCaml associative list by a JSON object.
An encoding of an OCaml pair by a JSON array with two cells.
An encoding of an OCaml triple by a JSON array with three cells.
val tup4 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
('f1 * 'f2 * 'f3 * 'f4) encoding
An encoding of an OCaml quadruple by a JSON array with four cells.
val tup5 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
'f5 encoding ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5) encoding
An encoding of an OCaml quintuple by a JSON array with five cells.
val tup6 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
'f5 encoding ->
'f6 encoding ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6) encoding
An encoding of an OCaml sextuple by a JSON array with six cells.
val tup7 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
'f5 encoding ->
'f6 encoding ->
'f7 encoding ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7) encoding
An encoding of an OCaml septuple by a JSON array with seven cells.
val tup8 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
'f5 encoding ->
'f6 encoding ->
'f7 encoding ->
'f8 encoding ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7 * 'f8) encoding
An encoding of an OCaml octuple by a JSON array with eight cells.
val tup9 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
'f5 encoding ->
'f6 encoding ->
'f7 encoding ->
'f8 encoding ->
'f9 encoding ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7 * 'f8 * 'f9) encoding
An encoding of an OCaml nonuple by a JSON array with nine cells.
val tup10 :
'f1 encoding ->
'f2 encoding ->
'f3 encoding ->
'f4 encoding ->
'f5 encoding ->
'f6 encoding ->
'f7 encoding ->
'f8 encoding ->
'f9 encoding ->
'f10 encoding ->
('f1 * 'f2 * 'f3 * 'f4 * 'f5 * 'f6 * 'f7 * 'f8 * 'f9 * 'f10) encoding
An encoding of an OCaml decuple by a JSON array with ten cells.
Merge two tuple encoding
s. For describing heavyweight arrays with a lot of cells. The ocaml type is a pair of tuples, but the JSON array is flat, with the elements of the first tuple before the ones of the second. Both arguments must be tuple encodings, otherwise a future construct
, destruct
or schema
will fail with Invalid_argument
.
JSON type combinators for unions
To be used inside a union
. Takes a encoding
for a specific case, and a converter to and from a type common to all cases ('t
). Usually, it consists in boxing / deboxing the specific data in an OCaml sum type contructor.
A utility to build destructors for custom encoded sum types.
JSON generic type combinators
val custom :
('t -> Json_repr.ezjsonm) ->
(Json_repr.ezjsonm -> 't) ->
schema:Json_schema.schema ->
't encoding
A simple custom encoding using the Json_repr.ezjsonm
intermediate representation for the conversion functions. The resulting encoding is usable with any other instanciation of functor Make
, internal conversions may be performed needed. The second transformer function can raise (Cannot_destruct ([ (* location *)], exn))
to indicate an error, which will be relocated correctly.
val conv :
('a -> 'b) ->
('b -> 'a) ->
?schema:Json_schema.schema ->
'b encoding ->
'a encoding
An encoding adapter, with an optional handwritten schema. The second transformer function can raise (Cannot_destruct ([], exn))
to indicate an error, which will be relocated correctly.
val mu :
string ->
?title:string ->
?description:string ->
('a encoding -> 'a encoding) ->
'a encoding
A fixpoint combinator. Links a recursive OCaml type to an internal JSON schema reference, by allowing to use the encoding inside its own definition. The first parameter is a path, that must be unique and respect the format of Json_schema.add_definition
. It is used to encode the recursivity as a named reference in the JSON schema.
Here is an example to turn a standard OCaml list into either "nil"
for []
or {"hd":hd,"tl":tl}
for hd::tl
.
let reclist itemencoding =
mu "list" @@ fun self ->
union
[ case (string_enum [ "nil", () ])
(function [] -> Some () | _ :: _ -> None)
(fun () -> []) ;
case (obj2 (req "hd" itemencoding) (req "tl" self))
(function hd :: tl -> Some (hd, tl) | [] -> None)
(fun (hd, tl) -> hd :: tl) ])
A raw JSON value in ezjsonm representation.
A valid JSON document (i.e. an array or object value).
The encoding of a JSON schema, linked to its OCaml definiton.
Exporting encoding
s as JSON schemas
Describe an encoding in JSON schema format. May raise Bad_schema
.
Name a definition so its occurences can be shared in the JSON schema. The first parameter is a path, that must be unique and respect the format of Json_schema.add_definition
.
Errors
Exception raised by destructors, with the location in the original JSON structure and the specific error.
Unexpected kind of data encountered (w/ the expectation).
Array of unexpected size encountered (w/ the expectation).
Missing field in an object.
Supernumerary field in an object.
Bad custom schema encountered.
val print_error :
?print_unknown:(Format.formatter -> exn -> unit) ->
Format.formatter ->
exn ->
unit
Produces a human readable version of an error.
Advanced interface for using a custom JSON representation
type 't repr_agnostic_custom = {
write : 'rt. (module Json_repr.Repr with type value = 'rt) -> 't -> 'rt;
read : 'rf. (module Json_repr.Repr with type value = 'rf) -> 'rf -> 't;
}
Custom encoders for an OCaml type, given both custom conversion functions. The actual representation is not known in advance, so the conversion functions have to examine / construct the JSON value through the first class modules they are passed. The read
transformer function can raise (Cannot_destruct ([], "message"))
to indicate an error, which will be relocated correctly.
Here is an example of how to build such a value for a type 't
.
let read
: type tf. (module Json_repr.Repr with type value = tf) -> tf -> 't
= fun (module Repr_f) repr ->
match Repr_f.view repr with
| `Null (* destruct the JSON using [Repr_f.view] *) ->
(* create a value of type 't *)
| _ ->
(* or fail with this wrapping exception *)
raise (Cannot_destruct ([ (* location *) ], (* exn *))) in
let write
: type tf. (module Json_repr.Repr with type value = tf) -> 't -> tf
= fun (module Repr_f) v ->
(* examine the value and produce a JSON using [Repr_f.repr] *)
Repr_f.repr `Null in
{ read ; write }
val repr_agnostic_custom :
't repr_agnostic_custom ->
schema:Json_schema.schema ->
't encoding
A custom encoding, using custom encoders and a schema.
A raw JSON value in its original representation.
- Dependent types describing JSON document structures
-
Constructors and destructors for
Json_repr.ezjsonm
- JSON type combinators for simple immediates
- JSON type combinators for objects
- JSON type combinators for arrays
- JSON type combinators for unions
- JSON generic type combinators
-
Exporting
encoding
s as JSON schemas - Errors
- Advanced interface for using a custom JSON representation