package ocplib-json-typed

  1. Overview
  2. Docs
Type-aware JSON and JSON schema utilities

Install

Dune Dependency

Authors

Maintainers

Sources

v0.7.tar.gz
md5=afa5aed32fcd7ff3ffae7c0adfb5de58
sha512=e564518999e3b88c4d734d783ba4ea3bdcf7c2b6f408db70d662a989e97a50192ef1c75ad9621505779609372bce0e765a5ceb4536a24c66deb359c37fc967f8

doc/ocplib-json-typed/Json_encoding/index.html

Module Json_encodingSource

JSON structure description using dependently typed combinators.

Dependent types describing JSON document structures

Sourcetype 'a encoding

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

Sourceval construct : 't encoding -> 't -> 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.

Sourceval destruct : 't encoding -> Json_repr.ezjsonm -> 't

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

Sourceval unit : unit encoding

An encoding of an OCaml unit by any (ignored) JSON.

Sourceval null : unit encoding

An encoding of an OCaml unit by a JSON null.

Sourceval empty : unit encoding

An encoding of an OCaml unit by an empty JSON object.

Sourceval int : int encoding

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.

Sourceval int32 : int32 encoding

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.

Sourceval int53 : int64 encoding

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.

Sourceval ranged_int : minimum:int -> maximum:int -> string -> int encoding

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.

Sourceval ranged_int32 : minimum:int32 -> maximum:int32 -> string -> int32 encoding

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.

Sourceval ranged_int53 : minimum:int64 -> maximum:int64 -> string -> int64 encoding

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.

Sourceval bool : bool encoding

An encoding of an OCaml boolean by a JSON one.

Sourceval string : string encoding

An encoding of an OCaml string by a JSON one.

Sourceval string_enum : (string * 'a) list -> 'a encoding

An encoding of a closed set of OCaml values by JSON strings.

Sourceval constant : string -> unit encoding

An encoding of a constant string.

Sourceval bytes : bytes encoding

An encoding of an OCaml mutable string by a JSON string.

Sourceval float : float encoding

An encoding of an OCaml float by a JSON number.

Sourceval ranged_float : minimum:float -> maximum:float -> string -> float encoding

An encoding of an OCaml float by a JSON number with range constraints

Sourceval option : 'a encoding -> 'a option encoding

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

Sourcetype 'a field

A first class handle to a JSON field.

Sourceval req : ?title:string -> ?description:string -> string -> 't encoding -> 't field

A required field of a given its type.

Sourceval opt : ?title:string -> ?description:string -> string -> 't encoding -> 't option field

An optional field of a given type, using an OCaml option.

Sourceval dft : ?title:string -> ?description:string -> string -> 't encoding -> 't -> 't field

An optional field of a given type, ommited when equal to a default value.

Sourceval obj1 : 'f1 field -> 'f1 encoding

An encoding of an OCaml value by a singleton object.

Sourceval obj2 : 'f1 field -> 'f2 field -> ('f1 * 'f2) encoding

An encoding of an OCaml pair by a JSON object with two fields.

Sourceval obj3 : 'f1 field -> 'f2 field -> 'f3 field -> ('f1 * 'f2 * 'f3) encoding

An encoding of an OCaml triple by a JSON object with three fields.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval merge_objs : 'o1 encoding -> 'o2 encoding -> ('o1 * 'o2) encoding

Merge two object encodings. For describing heavyweight objects with a lot of fields. The ocaml type is a pair of tuples, but the JSON object is flat. Both arguments must be object encodings, otherwise a future construct, destruct or schema will fail with Invalid_argument.

JSON type combinators for arrays

Sourceval array : 'a encoding -> 'a array encoding

An encoding of an OCaml array by a JSON one.

Sourceval list : 'a encoding -> 'a list encoding

An encoding of an OCaml list by a JSON one.

Sourceval assoc : 'a encoding -> (string * 'a) list encoding

An encoding of an OCaml associative list by a JSON object.

Sourceval tup1 : 'f1 encoding -> 'f1 encoding

An encoding of an OCaml value by a singleton array.

Sourceval tup2 : 'f1 encoding -> 'f2 encoding -> ('f1 * 'f2) encoding

An encoding of an OCaml pair by a JSON array with two cells.

Sourceval tup3 : 'f1 encoding -> 'f2 encoding -> 'f3 encoding -> ('f1 * 'f2 * 'f3) encoding

An encoding of an OCaml triple by a JSON array with three cells.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval 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.

Sourceval merge_tups : 'a1 encoding -> 'a2 encoding -> ('a1 * 'a2) encoding

Merge two tuple encodings. 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

Sourcetype 't case

A case for describing union types using union ans case.

Sourceval case : 'a encoding -> ('t -> 'a option) -> ('a -> 't) -> 't case

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.

Sourceval union : 't case list -> 't encoding

A utility to build destructors for custom encoded sum types.

JSON generic type combinators

Sourceval 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.

Sourceval 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.

Sourceval 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) ]) 
Sourceval any_ezjson_value : Json_repr.ezjsonm encoding

A raw JSON value in ezjsonm representation.

Sourceval any_document : Json_repr.any encoding

A valid JSON document (i.e. an array or object value).

The encoding of a JSON schema, linked to its OCaml definiton.

Exporting encodings as JSON schemas

Sourceval schema : ?definitions_path:string -> 't encoding -> Json_schema.schema

Describe an encoding in JSON schema format. May raise Bad_schema.

Sourceval def : string -> ?title:string -> ?description:string -> 't encoding -> 't encoding

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

Sourceexception Cannot_destruct of Json_query.path * exn

Exception raised by destructors, with the location in the original JSON structure and the specific error.

Sourceexception Unexpected of string * string

Unexpected kind of data encountered (w/ the expectation).

Sourceexception No_case_matched of exn list

Some union couldn't be destructed, w/ the reasons for each case.

Sourceexception Bad_array_size of int * int

Array of unexpected size encountered (w/ the expectation).

Sourceexception Missing_field of string

Missing field in an object.

Sourceexception Unexpected_field of string

Supernumerary field in an object.

Sourceexception Bad_schema of exn

Bad custom schema encountered.

Sourceval 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

Sourcemodule Make (Repr : Json_repr.Repr) : sig ... end
Sourcetype 't repr_agnostic_custom = {
  1. write : 'rt. (module Json_repr.Repr with type value = 'rt) -> 't -> 'rt;
  2. 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 } 
Sourceval 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.

Sourceval is_nullable : 't encoding -> bool

Returns true is the encoding might construct null.

OCaml

Innovation. Community. Security.