cpdf-source/cpdfyojson.mli

2296 lines
70 KiB
OCaml
Raw Normal View History

2021-10-05 18:16:13 +02:00
# 1 "yojson.cppo.mli"
(**
The Yojson library provides runtime functions for reading and writing JSON
data from OCaml. It addresses a few shortcomings of its predecessor
json-wheel and is about twice as fast (2.7x reading, 1.3x writing; results
may vary).
The design goals of Yojson are the following:
- Reducing inter-package dependencies by the use of polymorphic
variants for the JSON tree type.
- Allowing type-aware serializers/deserializers
to read and write directly without going through a generic JSON tree,
for efficiency purposes.
Readers and writers of all JSON syntaxic elements are provided
but are undocumented and meant to be used by generated OCaml code.
- Distinguishing between ints and floats.
- Providing optional extensions of the JSON syntax.
These extensions include comments, arbitrary strings,
optional quotes around field names, tuples and variants.
@author Martin Jambon
@see <http://json.org> JSON specification
*)
(** {1 Shared types and functions} *)
# 1 "common.mli"
val version : string
exception Json_error of string
val json_error : string -> 'a
type lexer_state = {
buf : Buffer.t;
(** Buffer used to accumulate substrings *)
mutable lnum : int;
(** Current line number (counting from 1) *)
mutable bol : int;
(** Absolute position of the first character of the current line
(counting from 0) *)
mutable fname : string option;
(** Name referencing the input file in error messages *)
}
module Lexer_state :
sig
type t = lexer_state = {
buf : Buffer.t;
mutable lnum : int;
mutable bol : int;
mutable fname : string option;
}
end
val init_lexer :
?buf: Buffer.t ->
?fname: string ->
?lnum: int ->
unit -> lexer_state
(** Create a fresh lexer_state record. *)
(**/**)
(* begin undocumented section *)
exception End_of_array
exception End_of_object
exception End_of_tuple
exception End_of_input
(* end undocumented section *)
(**/**)
# 27 "yojson.cppo.mli"
(** {1 Basic JSON tree type} *)
module Basic :
sig
(**
This module supports standard JSON nodes only, i.e. no special syntax
for variants or tuples as supported by {!Yojson.Safe}.
Arbitrary integers are not supported as they must all fit within the
standard OCaml int type (31 or 63 bits depending on the platform).
The main advantage of this module is its simplicity.
*)
# 1 "type.ml"
(** {3 Type of the JSON tree} *)
type t =
[
| `Null
| `Bool of bool
# 8 "type.ml"
| `Int of int
# 14 "type.ml"
| `Float of float
# 20 "type.ml"
| `String of string
# 25 "type.ml"
| `Assoc of (string * t) list
| `List of t list
# 33 "type.ml"
]
(**
All possible cases defined in Yojson:
- `Null: JSON null
- `Bool of bool: JSON boolean
- `Int of int: JSON number without decimal point or exponent.
- `Intlit of string: JSON number without decimal point or exponent,
preserved as a string.
- `Float of float: JSON number, Infinity, -Infinity or NaN.
- `Floatlit of string: JSON number, Infinity, -Infinity or NaN,
preserved as a string.
- `String of string: JSON string. Bytes in the range 128-255 are preserved
as-is without encoding validation for both reading
and writing.
- `Stringlit of string: JSON string literal including the double quotes.
- `Assoc of (string * json) list: JSON object.
- `List of json list: JSON array.
- `Tuple of json list: Tuple (non-standard extension of JSON).
Syntax: [("abc", 123)].
- `Variant of (string * json option): Variant (non-standard extension of JSON).
Syntax: [<"Foo">] or [<"Bar":123>].
*)
(*
Note to adventurers: ocamldoc does not support inline comments
on each polymorphic variant, and cppo doesn't allow to concatenate
comments, so it would be complicated to document only the
cases that are preserved by cppo in the type definition.
*)
# 1 "write.mli"
(** {2 JSON writers} *)
val to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t -> string
(** Write a compact JSON value to a string.
@param buf allows to reuse an existing buffer created with
[Buffer.create]. The buffer is cleared of all contents
before starting and right before returning.
@param len initial length of the output buffer.
@param std use only standard JSON syntax,
i.e. convert tuples and variants into standard JSON (if applicable),
refuse to print NaN and infinities,
require the root node to be either an object or an array.
Default is [false].
*)
val to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t -> unit
(** Write a compact JSON value to a channel.
@param buf allows to reuse an existing buffer created with
[Buffer.create] on the same channel.
[buf] is flushed right
before [to_channel] returns but the [out_channel] is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_output :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
< output : string -> int -> int -> int; .. > -> t -> unit
(** Write a compact JSON value to an OO channel.
@param buf allows to reuse an existing buffer created with
[Buffer.add_channel] on the same channel.
[buf] is flushed right
before [to_output] returns but the channel itself is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_file :
?len:int ->
?std:bool ->
string -> t -> unit
(** Write a compact JSON value to a file.
See [to_string] for the role of the optional arguments. *)
val to_buffer :
?std:bool ->
Buffer.t -> t -> unit
(** Write a compact JSON value to an existing buffer.
See [to_string] for the role of the optional argument. *)
val stream_to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t Stream.t -> string
(** Write a newline-separated sequence of compact one-line JSON values to
a string.
See [to_string] for the role of the optional arguments. *)
val stream_to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a channel.
See [to_channel] for the role of the optional arguments. *)
val stream_to_file :
?len:int ->
?std:bool ->
string -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a file.
See [to_string] for the role of the optional arguments. *)
val stream_to_buffer :
?std:bool ->
Buffer.t ->
t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
an existing buffer.
See [to_string] for the role of the optional arguments. *)
val write_t : Buffer.t -> t -> unit
(** Write the given JSON value to the given buffer.
Provided as a writer function for atdgen.
*)
(** {2 Miscellaneous} *)
val sort : t -> t
(** Sort object fields (stable sort, comparing field names
and treating them as byte sequences) *)
(**/**)
(* begin undocumented section *)
val write_null : Buffer.t -> unit -> unit
val write_bool : Buffer.t -> bool -> unit
# 113 "write.mli"
val write_int : Buffer.t -> int -> unit
# 116 "write.mli"
val write_float : Buffer.t -> float -> unit
val write_std_float : Buffer.t -> float -> unit
val write_float_fast : Buffer.t -> float -> unit
val write_std_float_fast : Buffer.t -> float -> unit
val write_float_prec : int -> Buffer.t -> float -> unit
val write_std_float_prec : int -> Buffer.t -> float -> unit
# 124 "write.mli"
val write_string : Buffer.t -> string -> unit
# 137 "write.mli"
val write_assoc : Buffer.t -> (string * t) list -> unit
val write_list : Buffer.t -> t list -> unit
# 148 "write.mli"
val write_json : Buffer.t -> t -> unit
val write_std_json : Buffer.t -> t -> unit
(* end undocumented section *)
(**/**)
# 1 "monomorphic.mli"
val pp : Format.formatter -> t -> unit
(** Pretty printer, useful for debugging *)
val show : t -> string
(** Convert value to string, useful for debugging *)
val equal : t -> t -> bool
(** [equal a b] is the monomorphic equality.
Determines whether two JSON values are considered equal. In the case of
JSON objects, the order of the keys does not matter, except for
duplicate keys which will be considered equal as long as they are in the
same input order.
*)
# 1 "write2.mli"
(** {2 JSON pretty-printing} *)
val pretty_print : ?std:bool -> Format.formatter -> t -> unit
(** Pretty-print into a {!Format.formatter}.
See [to_string] for the role of the optional [std] argument.
@since 1.3.1 *)
val pretty_to_string : ?std:bool -> t -> string
(** Pretty-print into a string.
See [to_string] for the role of the optional [std] argument.
*)
val pretty_to_channel : ?std:bool -> out_channel -> t -> unit
(** Pretty-print to a channel.
See [to_string] for the role of the optional [std] argument.
*)
# 1 "read.mli"
val prettify : ?std:bool -> string -> string
(** Combined parser and pretty-printer.
See [to_string] for the role of the optional [std] argument. *)
val compact : ?std:bool -> string -> string
(** Combined parser and printer.
See [to_string] for the role of the optional [std] argument. *)
(** {2 JSON readers} *)
exception Finally of exn * exn
(** Exception describing a failure in both finalizer and parsing. *)
val from_string :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t
(** Read a JSON value from a string.
@param buf use this buffer at will during parsing instead of creating
a new one.
@param fname data file name to be used in error messages. It does
not have to be a real file.
@param lnum number of the first line of input. Default is 1.
*)
val from_channel :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
in_channel -> t
(** Read a JSON value from a channel.
See [from_string] for the meaning of the optional arguments. *)
val from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t
(** Read a JSON value from a file.
See [from_string] for the meaning of the optional arguments. *)
type lexer_state = Lexer_state.t = {
buf : Buffer.t;
mutable lnum : int;
mutable bol : int;
mutable fname : string option;
}
(** This alias is provided for backward compatibility.
New code should refer to {!Yojson.lexer_state} directly.
*)
val init_lexer :
?buf: Buffer.t ->
?fname: string ->
?lnum: int ->
unit -> lexer_state
(** This alias is provided for backward compatibility.
New code should use {!Yojson.init_lexer} directly. *)
val from_lexbuf :
lexer_state ->
?stream:bool ->
Lexing.lexbuf -> t
(** Read a JSON value from a lexbuf.
A valid initial [lexer_state] can be created with [init_lexer].
See [from_string] for the meaning of the optional arguments.
@param stream indicates whether more data may follow. The default value
is false and indicates that only JSON whitespace can be found between
the end of the JSON value and the end of the input. *)
val stream_from_string :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t Stream.t
(** Input a sequence of JSON values from a string.
Whitespace between JSON values is fine but not required.
See [from_string] for the meaning of the optional arguments. *)
val stream_from_channel :
?buf:Buffer.t ->
?fin:(unit -> unit) ->
?fname:string ->
?lnum:int ->
in_channel -> t Stream.t
(** Input a sequence of JSON values from a channel.
Whitespace between JSON values is fine but not required.
@param fin finalization function executed once when the end of the
stream is reached either because there is no more input or because
the input could not be parsed, raising an exception.
@raise Finally When the parsing and the finalizer both raised, [Finally (exn, fin_exn)]
is raised, [exn] being the parsing exception and [fin_exn] the finalizer one.
See [from_string] for the meaning of the other optional arguments. *)
val stream_from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t Stream.t
(** Input a sequence of JSON values from a file.
Whitespace between JSON values is fine but not required.
See [from_string] for the meaning of the optional arguments. *)
val stream_from_lexbuf :
lexer_state ->
?fin:(unit -> unit) ->
Lexing.lexbuf -> t Stream.t
(** Input a sequence of JSON values from a lexbuf.
A valid initial [lexer_state] can be created with [init_lexer].
Whitespace between JSON values is fine but not required.
@raise Finally When the parsing and the finalizer both raised, [Finally (exn, fin_exn)]
is raised, [exn] being the parsing exception and [fin_exn] the finalizer one.
See [stream_from_channel] for the meaning of the optional [fin]
argument. *)
type json_line = [ `Json of t | `Exn of exn ]
(** The type of values resulting from a parsing attempt of a JSON value. *)
val linestream_from_channel :
?buf:Buffer.t ->
?fin:(unit -> unit) ->
?fname:string ->
?lnum:int ->
in_channel -> json_line Stream.t
(** Input a sequence of JSON values, one per line, from a channel.
Exceptions raised when reading malformed lines are caught
and represented using [`Exn].
See [stream_from_channel] for the meaning of the optional [fin]
argument.
See [from_string] for the meaning of the other optional arguments. *)
val linestream_from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> json_line Stream.t
(** Input a sequence of JSON values, one per line, from a file.
Exceptions raised when reading malformed lines are caught
and represented using [`Exn].
See [stream_from_channel] for the meaning of the optional [fin]
argument.
See [from_string] for the meaning of the other optional arguments. *)
val read_t : lexer_state -> Lexing.lexbuf -> t
(** Read a JSON value from the given lexer_state and lexing buffer and return it.
Provided as a reader function for atdgen.
*)
(**/**)
(* begin undocumented section *)
val finish_string : lexer_state -> Lexing.lexbuf -> string
val read_string : lexer_state -> Lexing.lexbuf -> string
val read_ident : lexer_state -> Lexing.lexbuf -> string
val map_string :
lexer_state -> (string -> int -> int -> 'a) -> Lexing.lexbuf -> 'a
(* equivalent to finish_string *)
val map_ident :
lexer_state -> (string -> int -> int -> 'a) -> Lexing.lexbuf -> 'a
(* equivalent to read_ident *)
type variant_kind = [ `Edgy_bracket | `Square_bracket | `Double_quote ]
val start_any_variant : lexer_state -> Lexing.lexbuf -> variant_kind
val finish_variant : lexer_state -> Lexing.lexbuf -> t option
val finish_skip_variant : lexer_state -> Lexing.lexbuf -> unit
val read_lt : lexer_state -> Lexing.lexbuf -> unit
val read_gt : lexer_state -> Lexing.lexbuf -> unit
val read_comma : lexer_state -> Lexing.lexbuf -> unit
val finish_stringlit : lexer_state -> Lexing.lexbuf -> string
val finish_skip_stringlit : lexer_state -> Lexing.lexbuf -> unit
val finish_escaped_char : lexer_state -> Lexing.lexbuf -> unit
val finish_comment : lexer_state -> Lexing.lexbuf -> unit
val read_space : lexer_state -> Lexing.lexbuf -> unit
val read_eof : Lexing.lexbuf -> bool
val read_null : lexer_state -> Lexing.lexbuf -> unit
val read_null_if_possible : lexer_state -> Lexing.lexbuf -> bool
val read_bool : lexer_state -> Lexing.lexbuf -> bool
val read_int : lexer_state -> Lexing.lexbuf -> int
val read_int8 : lexer_state -> Lexing.lexbuf -> char
val read_int32 : lexer_state -> Lexing.lexbuf -> int32
val read_int64 : lexer_state -> Lexing.lexbuf -> int64
val read_number : lexer_state -> Lexing.lexbuf -> float
val skip_ident : lexer_state -> Lexing.lexbuf -> unit
val read_sequence :
('a -> lexer_state -> Lexing.lexbuf -> 'a) ->
'a ->
lexer_state ->
Lexing.lexbuf -> 'a
val read_list :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a list
val read_list_rev :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a list
val read_array_end : Lexing.lexbuf -> unit
val read_array_sep : lexer_state -> Lexing.lexbuf -> unit
val read_array :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a array
val read_tuple :
(int -> 'a -> lexer_state -> Lexing.lexbuf -> 'a) ->
'a ->
lexer_state ->
Lexing.lexbuf -> 'a
val start_any_tuple : lexer_state -> Lexing.lexbuf -> bool
val read_lpar : lexer_state -> Lexing.lexbuf -> unit
val read_rpar : lexer_state -> Lexing.lexbuf -> unit
val read_tuple_end : Lexing.lexbuf -> unit
val read_tuple_end2 : lexer_state -> bool -> Lexing.lexbuf -> unit
val read_tuple_sep : lexer_state -> Lexing.lexbuf -> unit
val read_tuple_sep2 : lexer_state -> bool -> Lexing.lexbuf -> unit
val read_lbr : lexer_state -> Lexing.lexbuf -> unit
val read_rbr : lexer_state -> Lexing.lexbuf -> unit
val read_fields :
('acc -> string -> lexer_state -> Lexing.lexbuf -> 'acc) ->
'acc ->
lexer_state ->
Lexing.lexbuf -> 'acc
val read_abstract_fields :
(lexer_state -> Lexing.lexbuf -> 'key) ->
('acc -> 'key -> lexer_state -> Lexing.lexbuf -> 'acc) ->
'acc ->
lexer_state ->
Lexing.lexbuf -> 'acc
val read_lcurl : lexer_state -> Lexing.lexbuf -> unit
val read_object_end : Lexing.lexbuf -> unit
val read_object_sep : lexer_state -> Lexing.lexbuf -> unit
val read_colon : lexer_state -> Lexing.lexbuf -> unit
val read_json : lexer_state -> Lexing.lexbuf -> t
val skip_json : lexer_state -> Lexing.lexbuf -> unit
val buffer_json : lexer_state -> Lexing.lexbuf -> unit
val validate_json : 'path -> t -> 'error option
(* always returns [None].
Provided so that atdgen users can write:
type t <ocaml module="Yojson.Safe"> = abstract
*)
(* end undocumented section *)
(**/**)
# 48 "yojson.cppo.mli"
module Util :
sig
# 1 "util.mli"
(**
This module provides combinators for extracting fields from JSON
values. This approach is recommended for reading a few fields
from data returned by public APIs. However for more complex applications
we recommend {{:https://github.com/ahrefs/atd}Atdgen}.
Here is some sample JSON data:
{v
{
"id": "398eb027",
"name": "John Doe",
"pages": [
{
"id": 1,
"title": "The Art of Flipping Coins",
"url": "http://example.com/398eb027/1"
},
{
"id": 2,
"deleted": true
},
{
"id": 3,
"title": "Artichoke Salad",
"url": "http://example.com/398eb027/3"
},
{
"id": 4,
"title": "Flying Bananas",
"url": "http://example.com/398eb027/4"
}
]
}
v}
In order to extract the "id" field, assuming it is mandatory,
we would use the following OCaml code that operates on single JSON
nodes:
{v
open Yojson.Basic.Util
...
let id = json |> member "id" |> to_string in
...
v}
In order to extract all the "title" fields, we would write the following
OCaml code that operates on lists of JSON nodes, skipping
undefined nodes and nodes of unexpected type:
{v
open Yojson.Basic.Util
let extract_titles (json : Yojson.Basic.t) : string list =
[json]
|> filter_member "pages"
|> flatten
|> filter_member "title"
|> filter_string
v}
*)
exception Type_error of string * t
(** Raised when the JSON value is not of the correct type to support an
operation, e.g. [member] on an [`Int]. The string message explains the
mismatch. *)
exception Undefined of string * t
(** Raised when the equivalent JavaScript operation on the JSON value would
return undefined. Currently this only happens when an array index is out
of bounds. *)
val keys : t -> string list
(** Returns all the key names in the given JSON object *)
val values : t -> t list
(** Return all the value in the given JSON object *)
val combine : t -> t -> t
(** Combine two JSON Objects together *)
val member : string -> t -> t
(** [member k obj] returns the value associated with the key [k] in the JSON
object [obj], or [`Null] if [k] is not present in [obj]. *)
val index : int -> t -> t
(** [index i arr] returns the value at index [i] in the JSON array [arr].
Negative indices count from the end of the list (so -1 is the last
element). *)
val map : (t -> t) -> t -> t
(** [map f arr] calls the function [f] on each element of the JSON array
[arr], and returns a JSON array containing the results. *)
val to_assoc : t -> (string * t) list
(** Extract the items of a JSON object or raise [Type_error]. *)
val to_option : (t -> 'a) -> t -> 'a option
(** Return [None] if the JSON value is null or map the JSON value
to [Some] value using the provided function. *)
val to_bool : t -> bool
(** Extract a boolean value or raise [Type_error]. *)
val to_bool_option : t -> bool option
(** Extract [Some] boolean value,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val to_number : t -> float
(** Extract a number or raise [Type_error]. *)
val to_number_option : t -> float option
(** Extract [Some] number,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val to_float : t -> float
(** Extract a float value or raise [Type_error].
[to_number] is generally preferred as it also works with int literals. *)
val to_float_option : t -> float option
(** Extract [Some] float value,
return [None] if the value is null,
or raise [Type_error] otherwise.
[to_number_option] is generally preferred as it also works
with int literals. *)
val to_int : t -> int
(** Extract an int from a JSON int or raise [Type_error]. *)
val to_int_option : t -> int option
(** Extract [Some] int from a JSON int,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val to_list : t -> t list
(** Extract a list from JSON array or raise [Type_error]. *)
val to_string : t -> string
(** Extract a string from a JSON string or raise [Type_error]. *)
val to_string_option : t -> string option
(** Extract [Some] string from a JSON string,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val convert_each : (t -> 'a) -> t -> 'a list
(** The conversion functions above cannot be used with [map], because they do
not return JSON values. This convenience function [convert_each to_f arr]
is equivalent to [List.map to_f (to_list arr)]. *)
(** {3 Exception-free filters} *)
(**
The following functions operate on lists of JSON nodes.
None of them raises an exception when a certain kind of node is expected
but no node or the wrong kind of node is found.
Instead of raising an exception, nodes that are not as expected
are simply ignored.
*)
val filter_map : ('a -> 'b option) -> 'a list -> 'b list
(** [filter_map f l] maps each element of the list [l] to an optional value
using function [f] and unwraps the resulting values. *)
val flatten : t list -> t list
(** Expects JSON arrays and returns all their elements as a single
list. [flatten l] is equivalent to [List.flatten (filter_list l)]. *)
val filter_index : int -> t list -> t list
(** Expects JSON arrays and returns all their elements existing at the given
position. *)
val filter_list : t list -> t list list
(** Expects JSON arrays and unwraps them. *)
val filter_member : string -> t list -> t list
(** Expects JSON objects and returns all the fields of the given name
(at most one field per object). *)
val filter_assoc : t list -> (string * t) list list
(** Expects JSON objects and unwraps them. *)
val filter_bool : t list -> bool list
(** Expects JSON booleans and unwraps them. *)
val filter_int : t list -> int list
(** Expects JSON integers ([`Int] nodes) and unwraps them. *)
val filter_float : t list -> float list
(** Expects JSON floats ([`Float] nodes) and unwraps them. *)
val filter_number : t list -> float list
(** Expects JSON numbers ([`Int] or [`Float]) and unwraps them.
Ints are converted to floats. *)
val filter_string : t list -> string list
(** Expects JSON strings and unwraps them. *)
# 51 "yojson.cppo.mli"
end
# 55 "yojson.cppo.mli"
end
(** {1 Multipurpose JSON tree type} *)
module Safe :
sig
(**
This module supports a specific syntax for variants and tuples
in addition to the standard JSON nodes.
Arbitrary integers are supported and represented as a decimal string
using [`Intlit] when they cannot be represented using OCaml's int type.
This module is recommended for intensive use
or OCaml-friendly use of JSON.
*)
# 1 "type.ml"
(** {3 Type of the JSON tree} *)
type t =
[
| `Null
| `Bool of bool
# 8 "type.ml"
| `Int of int
# 11 "type.ml"
| `Intlit of string
# 14 "type.ml"
| `Float of float
# 20 "type.ml"
| `String of string
# 25 "type.ml"
| `Assoc of (string * t) list
| `List of t list
# 28 "type.ml"
| `Tuple of t list
# 31 "type.ml"
| `Variant of (string * t option)
# 33 "type.ml"
]
(**
All possible cases defined in Yojson:
- `Null: JSON null
- `Bool of bool: JSON boolean
- `Int of int: JSON number without decimal point or exponent.
- `Intlit of string: JSON number without decimal point or exponent,
preserved as a string.
- `Float of float: JSON number, Infinity, -Infinity or NaN.
- `Floatlit of string: JSON number, Infinity, -Infinity or NaN,
preserved as a string.
- `String of string: JSON string. Bytes in the range 128-255 are preserved
as-is without encoding validation for both reading
and writing.
- `Stringlit of string: JSON string literal including the double quotes.
- `Assoc of (string * json) list: JSON object.
- `List of json list: JSON array.
- `Tuple of json list: Tuple (non-standard extension of JSON).
Syntax: [("abc", 123)].
- `Variant of (string * json option): Variant (non-standard extension of JSON).
Syntax: [<"Foo">] or [<"Bar":123>].
*)
(*
Note to adventurers: ocamldoc does not support inline comments
on each polymorphic variant, and cppo doesn't allow to concatenate
comments, so it would be complicated to document only the
cases that are preserved by cppo in the type definition.
*)
# 1 "monomorphic.mli"
val pp : Format.formatter -> t -> unit
(** Pretty printer, useful for debugging *)
val show : t -> string
(** Convert value to string, useful for debugging *)
val equal : t -> t -> bool
(** [equal a b] is the monomorphic equality.
Determines whether two JSON values are considered equal. In the case of
JSON objects, the order of the keys does not matter, except for
duplicate keys which will be considered equal as long as they are in the
same input order.
*)
# 1 "safe.mli"
val to_basic : t -> Basic.t
(**
Tuples are converted to JSON arrays,
Variants are converted to JSON strings or arrays of a string (constructor)
and a json value (argument).
Long integers are converted to JSON strings.
Examples:
{v
`Tuple [ `Int 1; `Float 2.3 ] -> `List [ `Int 1; `Float 2.3 ]
`Variant ("A", None) -> `String "A"
`Variant ("B", Some x) -> `List [ `String "B", x ]
`Intlit "12345678901234567890" -> `String "12345678901234567890"
v}
*)
# 1 "write.mli"
(** {2 JSON writers} *)
val to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t -> string
(** Write a compact JSON value to a string.
@param buf allows to reuse an existing buffer created with
[Buffer.create]. The buffer is cleared of all contents
before starting and right before returning.
@param len initial length of the output buffer.
@param std use only standard JSON syntax,
i.e. convert tuples and variants into standard JSON (if applicable),
refuse to print NaN and infinities,
require the root node to be either an object or an array.
Default is [false].
*)
val to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t -> unit
(** Write a compact JSON value to a channel.
@param buf allows to reuse an existing buffer created with
[Buffer.create] on the same channel.
[buf] is flushed right
before [to_channel] returns but the [out_channel] is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_output :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
< output : string -> int -> int -> int; .. > -> t -> unit
(** Write a compact JSON value to an OO channel.
@param buf allows to reuse an existing buffer created with
[Buffer.add_channel] on the same channel.
[buf] is flushed right
before [to_output] returns but the channel itself is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_file :
?len:int ->
?std:bool ->
string -> t -> unit
(** Write a compact JSON value to a file.
See [to_string] for the role of the optional arguments. *)
val to_buffer :
?std:bool ->
Buffer.t -> t -> unit
(** Write a compact JSON value to an existing buffer.
See [to_string] for the role of the optional argument. *)
val stream_to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t Stream.t -> string
(** Write a newline-separated sequence of compact one-line JSON values to
a string.
See [to_string] for the role of the optional arguments. *)
val stream_to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a channel.
See [to_channel] for the role of the optional arguments. *)
val stream_to_file :
?len:int ->
?std:bool ->
string -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a file.
See [to_string] for the role of the optional arguments. *)
val stream_to_buffer :
?std:bool ->
Buffer.t ->
t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
an existing buffer.
See [to_string] for the role of the optional arguments. *)
val write_t : Buffer.t -> t -> unit
(** Write the given JSON value to the given buffer.
Provided as a writer function for atdgen.
*)
(** {2 Miscellaneous} *)
val sort : t -> t
(** Sort object fields (stable sort, comparing field names
and treating them as byte sequences) *)
(**/**)
(* begin undocumented section *)
val write_null : Buffer.t -> unit -> unit
val write_bool : Buffer.t -> bool -> unit
# 113 "write.mli"
val write_int : Buffer.t -> int -> unit
# 116 "write.mli"
val write_float : Buffer.t -> float -> unit
val write_std_float : Buffer.t -> float -> unit
val write_float_fast : Buffer.t -> float -> unit
val write_std_float_fast : Buffer.t -> float -> unit
val write_float_prec : int -> Buffer.t -> float -> unit
val write_std_float_prec : int -> Buffer.t -> float -> unit
# 124 "write.mli"
val write_string : Buffer.t -> string -> unit
# 128 "write.mli"
val write_intlit : Buffer.t -> string -> unit
# 137 "write.mli"
val write_assoc : Buffer.t -> (string * t) list -> unit
val write_list : Buffer.t -> t list -> unit
# 140 "write.mli"
val write_tuple : Buffer.t -> t list -> unit
val write_std_tuple : Buffer.t -> t list -> unit
# 144 "write.mli"
val write_variant : Buffer.t -> string -> t option -> unit
val write_std_variant : Buffer.t -> string -> t option -> unit
# 148 "write.mli"
val write_json : Buffer.t -> t -> unit
val write_std_json : Buffer.t -> t -> unit
(* end undocumented section *)
(**/**)
# 1 "write2.mli"
(** {2 JSON pretty-printing} *)
val pretty_print : ?std:bool -> Format.formatter -> t -> unit
(** Pretty-print into a {!Format.formatter}.
See [to_string] for the role of the optional [std] argument.
@since 1.3.1 *)
val pretty_to_string : ?std:bool -> t -> string
(** Pretty-print into a string.
See [to_string] for the role of the optional [std] argument.
*)
val pretty_to_channel : ?std:bool -> out_channel -> t -> unit
(** Pretty-print to a channel.
See [to_string] for the role of the optional [std] argument.
*)
# 1 "read.mli"
val prettify : ?std:bool -> string -> string
(** Combined parser and pretty-printer.
See [to_string] for the role of the optional [std] argument. *)
val compact : ?std:bool -> string -> string
(** Combined parser and printer.
See [to_string] for the role of the optional [std] argument. *)
(** {2 JSON readers} *)
exception Finally of exn * exn
(** Exception describing a failure in both finalizer and parsing. *)
val from_string :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t
(** Read a JSON value from a string.
@param buf use this buffer at will during parsing instead of creating
a new one.
@param fname data file name to be used in error messages. It does
not have to be a real file.
@param lnum number of the first line of input. Default is 1.
*)
val from_channel :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
in_channel -> t
(** Read a JSON value from a channel.
See [from_string] for the meaning of the optional arguments. *)
val from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t
(** Read a JSON value from a file.
See [from_string] for the meaning of the optional arguments. *)
type lexer_state = Lexer_state.t = {
buf : Buffer.t;
mutable lnum : int;
mutable bol : int;
mutable fname : string option;
}
(** This alias is provided for backward compatibility.
New code should refer to {!Yojson.lexer_state} directly.
*)
val init_lexer :
?buf: Buffer.t ->
?fname: string ->
?lnum: int ->
unit -> lexer_state
(** This alias is provided for backward compatibility.
New code should use {!Yojson.init_lexer} directly. *)
val from_lexbuf :
lexer_state ->
?stream:bool ->
Lexing.lexbuf -> t
(** Read a JSON value from a lexbuf.
A valid initial [lexer_state] can be created with [init_lexer].
See [from_string] for the meaning of the optional arguments.
@param stream indicates whether more data may follow. The default value
is false and indicates that only JSON whitespace can be found between
the end of the JSON value and the end of the input. *)
val stream_from_string :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t Stream.t
(** Input a sequence of JSON values from a string.
Whitespace between JSON values is fine but not required.
See [from_string] for the meaning of the optional arguments. *)
val stream_from_channel :
?buf:Buffer.t ->
?fin:(unit -> unit) ->
?fname:string ->
?lnum:int ->
in_channel -> t Stream.t
(** Input a sequence of JSON values from a channel.
Whitespace between JSON values is fine but not required.
@param fin finalization function executed once when the end of the
stream is reached either because there is no more input or because
the input could not be parsed, raising an exception.
@raise Finally When the parsing and the finalizer both raised, [Finally (exn, fin_exn)]
is raised, [exn] being the parsing exception and [fin_exn] the finalizer one.
See [from_string] for the meaning of the other optional arguments. *)
val stream_from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t Stream.t
(** Input a sequence of JSON values from a file.
Whitespace between JSON values is fine but not required.
See [from_string] for the meaning of the optional arguments. *)
val stream_from_lexbuf :
lexer_state ->
?fin:(unit -> unit) ->
Lexing.lexbuf -> t Stream.t
(** Input a sequence of JSON values from a lexbuf.
A valid initial [lexer_state] can be created with [init_lexer].
Whitespace between JSON values is fine but not required.
@raise Finally When the parsing and the finalizer both raised, [Finally (exn, fin_exn)]
is raised, [exn] being the parsing exception and [fin_exn] the finalizer one.
See [stream_from_channel] for the meaning of the optional [fin]
argument. *)
type json_line = [ `Json of t | `Exn of exn ]
(** The type of values resulting from a parsing attempt of a JSON value. *)
val linestream_from_channel :
?buf:Buffer.t ->
?fin:(unit -> unit) ->
?fname:string ->
?lnum:int ->
in_channel -> json_line Stream.t
(** Input a sequence of JSON values, one per line, from a channel.
Exceptions raised when reading malformed lines are caught
and represented using [`Exn].
See [stream_from_channel] for the meaning of the optional [fin]
argument.
See [from_string] for the meaning of the other optional arguments. *)
val linestream_from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> json_line Stream.t
(** Input a sequence of JSON values, one per line, from a file.
Exceptions raised when reading malformed lines are caught
and represented using [`Exn].
See [stream_from_channel] for the meaning of the optional [fin]
argument.
See [from_string] for the meaning of the other optional arguments. *)
val read_t : lexer_state -> Lexing.lexbuf -> t
(** Read a JSON value from the given lexer_state and lexing buffer and return it.
Provided as a reader function for atdgen.
*)
(**/**)
(* begin undocumented section *)
val finish_string : lexer_state -> Lexing.lexbuf -> string
val read_string : lexer_state -> Lexing.lexbuf -> string
val read_ident : lexer_state -> Lexing.lexbuf -> string
val map_string :
lexer_state -> (string -> int -> int -> 'a) -> Lexing.lexbuf -> 'a
(* equivalent to finish_string *)
val map_ident :
lexer_state -> (string -> int -> int -> 'a) -> Lexing.lexbuf -> 'a
(* equivalent to read_ident *)
type variant_kind = [ `Edgy_bracket | `Square_bracket | `Double_quote ]
val start_any_variant : lexer_state -> Lexing.lexbuf -> variant_kind
val finish_variant : lexer_state -> Lexing.lexbuf -> t option
val finish_skip_variant : lexer_state -> Lexing.lexbuf -> unit
val read_lt : lexer_state -> Lexing.lexbuf -> unit
val read_gt : lexer_state -> Lexing.lexbuf -> unit
val read_comma : lexer_state -> Lexing.lexbuf -> unit
val finish_stringlit : lexer_state -> Lexing.lexbuf -> string
val finish_skip_stringlit : lexer_state -> Lexing.lexbuf -> unit
val finish_escaped_char : lexer_state -> Lexing.lexbuf -> unit
val finish_comment : lexer_state -> Lexing.lexbuf -> unit
val read_space : lexer_state -> Lexing.lexbuf -> unit
val read_eof : Lexing.lexbuf -> bool
val read_null : lexer_state -> Lexing.lexbuf -> unit
val read_null_if_possible : lexer_state -> Lexing.lexbuf -> bool
val read_bool : lexer_state -> Lexing.lexbuf -> bool
val read_int : lexer_state -> Lexing.lexbuf -> int
val read_int8 : lexer_state -> Lexing.lexbuf -> char
val read_int32 : lexer_state -> Lexing.lexbuf -> int32
val read_int64 : lexer_state -> Lexing.lexbuf -> int64
val read_number : lexer_state -> Lexing.lexbuf -> float
val skip_ident : lexer_state -> Lexing.lexbuf -> unit
val read_sequence :
('a -> lexer_state -> Lexing.lexbuf -> 'a) ->
'a ->
lexer_state ->
Lexing.lexbuf -> 'a
val read_list :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a list
val read_list_rev :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a list
val read_array_end : Lexing.lexbuf -> unit
val read_array_sep : lexer_state -> Lexing.lexbuf -> unit
val read_array :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a array
val read_tuple :
(int -> 'a -> lexer_state -> Lexing.lexbuf -> 'a) ->
'a ->
lexer_state ->
Lexing.lexbuf -> 'a
val start_any_tuple : lexer_state -> Lexing.lexbuf -> bool
val read_lpar : lexer_state -> Lexing.lexbuf -> unit
val read_rpar : lexer_state -> Lexing.lexbuf -> unit
val read_tuple_end : Lexing.lexbuf -> unit
val read_tuple_end2 : lexer_state -> bool -> Lexing.lexbuf -> unit
val read_tuple_sep : lexer_state -> Lexing.lexbuf -> unit
val read_tuple_sep2 : lexer_state -> bool -> Lexing.lexbuf -> unit
val read_lbr : lexer_state -> Lexing.lexbuf -> unit
val read_rbr : lexer_state -> Lexing.lexbuf -> unit
val read_fields :
('acc -> string -> lexer_state -> Lexing.lexbuf -> 'acc) ->
'acc ->
lexer_state ->
Lexing.lexbuf -> 'acc
val read_abstract_fields :
(lexer_state -> Lexing.lexbuf -> 'key) ->
('acc -> 'key -> lexer_state -> Lexing.lexbuf -> 'acc) ->
'acc ->
lexer_state ->
Lexing.lexbuf -> 'acc
val read_lcurl : lexer_state -> Lexing.lexbuf -> unit
val read_object_end : Lexing.lexbuf -> unit
val read_object_sep : lexer_state -> Lexing.lexbuf -> unit
val read_colon : lexer_state -> Lexing.lexbuf -> unit
val read_json : lexer_state -> Lexing.lexbuf -> t
val skip_json : lexer_state -> Lexing.lexbuf -> unit
val buffer_json : lexer_state -> Lexing.lexbuf -> unit
val validate_json : 'path -> t -> 'error option
(* always returns [None].
Provided so that atdgen users can write:
type t <ocaml module="Yojson.Safe"> = abstract
*)
(* end undocumented section *)
(**/**)
# 83 "yojson.cppo.mli"
module Util :
sig
# 1 "util.mli"
(**
This module provides combinators for extracting fields from JSON
values. This approach is recommended for reading a few fields
from data returned by public APIs. However for more complex applications
we recommend {{:https://github.com/ahrefs/atd}Atdgen}.
Here is some sample JSON data:
{v
{
"id": "398eb027",
"name": "John Doe",
"pages": [
{
"id": 1,
"title": "The Art of Flipping Coins",
"url": "http://example.com/398eb027/1"
},
{
"id": 2,
"deleted": true
},
{
"id": 3,
"title": "Artichoke Salad",
"url": "http://example.com/398eb027/3"
},
{
"id": 4,
"title": "Flying Bananas",
"url": "http://example.com/398eb027/4"
}
]
}
v}
In order to extract the "id" field, assuming it is mandatory,
we would use the following OCaml code that operates on single JSON
nodes:
{v
open Yojson.Basic.Util
...
let id = json |> member "id" |> to_string in
...
v}
In order to extract all the "title" fields, we would write the following
OCaml code that operates on lists of JSON nodes, skipping
undefined nodes and nodes of unexpected type:
{v
open Yojson.Basic.Util
let extract_titles (json : Yojson.Basic.t) : string list =
[json]
|> filter_member "pages"
|> flatten
|> filter_member "title"
|> filter_string
v}
*)
exception Type_error of string * t
(** Raised when the JSON value is not of the correct type to support an
operation, e.g. [member] on an [`Int]. The string message explains the
mismatch. *)
exception Undefined of string * t
(** Raised when the equivalent JavaScript operation on the JSON value would
return undefined. Currently this only happens when an array index is out
of bounds. *)
val keys : t -> string list
(** Returns all the key names in the given JSON object *)
val values : t -> t list
(** Return all the value in the given JSON object *)
val combine : t -> t -> t
(** Combine two JSON Objects together *)
val member : string -> t -> t
(** [member k obj] returns the value associated with the key [k] in the JSON
object [obj], or [`Null] if [k] is not present in [obj]. *)
val index : int -> t -> t
(** [index i arr] returns the value at index [i] in the JSON array [arr].
Negative indices count from the end of the list (so -1 is the last
element). *)
val map : (t -> t) -> t -> t
(** [map f arr] calls the function [f] on each element of the JSON array
[arr], and returns a JSON array containing the results. *)
val to_assoc : t -> (string * t) list
(** Extract the items of a JSON object or raise [Type_error]. *)
val to_option : (t -> 'a) -> t -> 'a option
(** Return [None] if the JSON value is null or map the JSON value
to [Some] value using the provided function. *)
val to_bool : t -> bool
(** Extract a boolean value or raise [Type_error]. *)
val to_bool_option : t -> bool option
(** Extract [Some] boolean value,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val to_number : t -> float
(** Extract a number or raise [Type_error]. *)
val to_number_option : t -> float option
(** Extract [Some] number,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val to_float : t -> float
(** Extract a float value or raise [Type_error].
[to_number] is generally preferred as it also works with int literals. *)
val to_float_option : t -> float option
(** Extract [Some] float value,
return [None] if the value is null,
or raise [Type_error] otherwise.
[to_number_option] is generally preferred as it also works
with int literals. *)
val to_int : t -> int
(** Extract an int from a JSON int or raise [Type_error]. *)
val to_int_option : t -> int option
(** Extract [Some] int from a JSON int,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val to_list : t -> t list
(** Extract a list from JSON array or raise [Type_error]. *)
val to_string : t -> string
(** Extract a string from a JSON string or raise [Type_error]. *)
val to_string_option : t -> string option
(** Extract [Some] string from a JSON string,
return [None] if the value is null,
or raise [Type_error] otherwise. *)
val convert_each : (t -> 'a) -> t -> 'a list
(** The conversion functions above cannot be used with [map], because they do
not return JSON values. This convenience function [convert_each to_f arr]
is equivalent to [List.map to_f (to_list arr)]. *)
(** {3 Exception-free filters} *)
(**
The following functions operate on lists of JSON nodes.
None of them raises an exception when a certain kind of node is expected
but no node or the wrong kind of node is found.
Instead of raising an exception, nodes that are not as expected
are simply ignored.
*)
val filter_map : ('a -> 'b option) -> 'a list -> 'b list
(** [filter_map f l] maps each element of the list [l] to an optional value
using function [f] and unwraps the resulting values. *)
val flatten : t list -> t list
(** Expects JSON arrays and returns all their elements as a single
list. [flatten l] is equivalent to [List.flatten (filter_list l)]. *)
val filter_index : int -> t list -> t list
(** Expects JSON arrays and returns all their elements existing at the given
position. *)
val filter_list : t list -> t list list
(** Expects JSON arrays and unwraps them. *)
val filter_member : string -> t list -> t list
(** Expects JSON objects and returns all the fields of the given name
(at most one field per object). *)
val filter_assoc : t list -> (string * t) list list
(** Expects JSON objects and unwraps them. *)
val filter_bool : t list -> bool list
(** Expects JSON booleans and unwraps them. *)
val filter_int : t list -> int list
(** Expects JSON integers ([`Int] nodes) and unwraps them. *)
val filter_float : t list -> float list
(** Expects JSON floats ([`Float] nodes) and unwraps them. *)
val filter_number : t list -> float list
(** Expects JSON numbers ([`Int] or [`Float]) and unwraps them.
Ints are converted to floats. *)
val filter_string : t list -> string list
(** Expects JSON strings and unwraps them. *)
# 86 "yojson.cppo.mli"
end
# 93 "yojson.cppo.mli"
end
(** {1 JSON tree type with literal int/float/string leaves} *)
module Raw :
sig
(**
Ints, floats and strings literals are systematically preserved using
[`Intlit], [`Floatlit] and [`Stringlit].
This module also supports the specific syntax for variants and tuples
supported by {!Yojson.Safe}.
*)
# 1 "type.ml"
(** {3 Type of the JSON tree} *)
type t =
[
| `Null
| `Bool of bool
# 11 "type.ml"
| `Intlit of string
# 17 "type.ml"
| `Floatlit of string
# 23 "type.ml"
| `Stringlit of string
# 25 "type.ml"
| `Assoc of (string * t) list
| `List of t list
# 28 "type.ml"
| `Tuple of t list
# 31 "type.ml"
| `Variant of (string * t option)
# 33 "type.ml"
]
(**
All possible cases defined in Yojson:
- `Null: JSON null
- `Bool of bool: JSON boolean
- `Int of int: JSON number without decimal point or exponent.
- `Intlit of string: JSON number without decimal point or exponent,
preserved as a string.
- `Float of float: JSON number, Infinity, -Infinity or NaN.
- `Floatlit of string: JSON number, Infinity, -Infinity or NaN,
preserved as a string.
- `String of string: JSON string. Bytes in the range 128-255 are preserved
as-is without encoding validation for both reading
and writing.
- `Stringlit of string: JSON string literal including the double quotes.
- `Assoc of (string * json) list: JSON object.
- `List of json list: JSON array.
- `Tuple of json list: Tuple (non-standard extension of JSON).
Syntax: [("abc", 123)].
- `Variant of (string * json option): Variant (non-standard extension of JSON).
Syntax: [<"Foo">] or [<"Bar":123>].
*)
(*
Note to adventurers: ocamldoc does not support inline comments
on each polymorphic variant, and cppo doesn't allow to concatenate
comments, so it would be complicated to document only the
cases that are preserved by cppo in the type definition.
*)
# 1 "monomorphic.mli"
val pp : Format.formatter -> t -> unit
(** Pretty printer, useful for debugging *)
val show : t -> string
(** Convert value to string, useful for debugging *)
val equal : t -> t -> bool
(** [equal a b] is the monomorphic equality.
Determines whether two JSON values are considered equal. In the case of
JSON objects, the order of the keys does not matter, except for
duplicate keys which will be considered equal as long as they are in the
same input order.
*)
# 1 "write.mli"
(** {2 JSON writers} *)
val to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t -> string
(** Write a compact JSON value to a string.
@param buf allows to reuse an existing buffer created with
[Buffer.create]. The buffer is cleared of all contents
before starting and right before returning.
@param len initial length of the output buffer.
@param std use only standard JSON syntax,
i.e. convert tuples and variants into standard JSON (if applicable),
refuse to print NaN and infinities,
require the root node to be either an object or an array.
Default is [false].
*)
val to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t -> unit
(** Write a compact JSON value to a channel.
@param buf allows to reuse an existing buffer created with
[Buffer.create] on the same channel.
[buf] is flushed right
before [to_channel] returns but the [out_channel] is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_output :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
< output : string -> int -> int -> int; .. > -> t -> unit
(** Write a compact JSON value to an OO channel.
@param buf allows to reuse an existing buffer created with
[Buffer.add_channel] on the same channel.
[buf] is flushed right
before [to_output] returns but the channel itself is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_file :
?len:int ->
?std:bool ->
string -> t -> unit
(** Write a compact JSON value to a file.
See [to_string] for the role of the optional arguments. *)
val to_buffer :
?std:bool ->
Buffer.t -> t -> unit
(** Write a compact JSON value to an existing buffer.
See [to_string] for the role of the optional argument. *)
val stream_to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t Stream.t -> string
(** Write a newline-separated sequence of compact one-line JSON values to
a string.
See [to_string] for the role of the optional arguments. *)
val stream_to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a channel.
See [to_channel] for the role of the optional arguments. *)
val stream_to_file :
?len:int ->
?std:bool ->
string -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a file.
See [to_string] for the role of the optional arguments. *)
val stream_to_buffer :
?std:bool ->
Buffer.t ->
t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
an existing buffer.
See [to_string] for the role of the optional arguments. *)
val write_t : Buffer.t -> t -> unit
(** Write the given JSON value to the given buffer.
Provided as a writer function for atdgen.
*)
(** {2 Miscellaneous} *)
val sort : t -> t
(** Sort object fields (stable sort, comparing field names
and treating them as byte sequences) *)
(**/**)
(* begin undocumented section *)
val write_null : Buffer.t -> unit -> unit
val write_bool : Buffer.t -> bool -> unit
# 128 "write.mli"
val write_intlit : Buffer.t -> string -> unit
# 131 "write.mli"
val write_floatlit : Buffer.t -> string -> unit
# 134 "write.mli"
val write_stringlit : Buffer.t -> string -> unit
# 137 "write.mli"
val write_assoc : Buffer.t -> (string * t) list -> unit
val write_list : Buffer.t -> t list -> unit
# 140 "write.mli"
val write_tuple : Buffer.t -> t list -> unit
val write_std_tuple : Buffer.t -> t list -> unit
# 144 "write.mli"
val write_variant : Buffer.t -> string -> t option -> unit
val write_std_variant : Buffer.t -> string -> t option -> unit
# 148 "write.mli"
val write_json : Buffer.t -> t -> unit
val write_std_json : Buffer.t -> t -> unit
(* end undocumented section *)
(**/**)
# 1 "write2.mli"
(** {2 JSON pretty-printing} *)
val pretty_print : ?std:bool -> Format.formatter -> t -> unit
(** Pretty-print into a {!Format.formatter}.
See [to_string] for the role of the optional [std] argument.
@since 1.3.1 *)
val pretty_to_string : ?std:bool -> t -> string
(** Pretty-print into a string.
See [to_string] for the role of the optional [std] argument.
*)
val pretty_to_channel : ?std:bool -> out_channel -> t -> unit
(** Pretty-print to a channel.
See [to_string] for the role of the optional [std] argument.
*)
# 1 "read.mli"
val prettify : ?std:bool -> string -> string
(** Combined parser and pretty-printer.
See [to_string] for the role of the optional [std] argument. *)
val compact : ?std:bool -> string -> string
(** Combined parser and printer.
See [to_string] for the role of the optional [std] argument. *)
(** {2 JSON readers} *)
exception Finally of exn * exn
(** Exception describing a failure in both finalizer and parsing. *)
val from_string :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t
(** Read a JSON value from a string.
@param buf use this buffer at will during parsing instead of creating
a new one.
@param fname data file name to be used in error messages. It does
not have to be a real file.
@param lnum number of the first line of input. Default is 1.
*)
val from_channel :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
in_channel -> t
(** Read a JSON value from a channel.
See [from_string] for the meaning of the optional arguments. *)
val from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t
(** Read a JSON value from a file.
See [from_string] for the meaning of the optional arguments. *)
type lexer_state = Lexer_state.t = {
buf : Buffer.t;
mutable lnum : int;
mutable bol : int;
mutable fname : string option;
}
(** This alias is provided for backward compatibility.
New code should refer to {!Yojson.lexer_state} directly.
*)
val init_lexer :
?buf: Buffer.t ->
?fname: string ->
?lnum: int ->
unit -> lexer_state
(** This alias is provided for backward compatibility.
New code should use {!Yojson.init_lexer} directly. *)
val from_lexbuf :
lexer_state ->
?stream:bool ->
Lexing.lexbuf -> t
(** Read a JSON value from a lexbuf.
A valid initial [lexer_state] can be created with [init_lexer].
See [from_string] for the meaning of the optional arguments.
@param stream indicates whether more data may follow. The default value
is false and indicates that only JSON whitespace can be found between
the end of the JSON value and the end of the input. *)
val stream_from_string :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t Stream.t
(** Input a sequence of JSON values from a string.
Whitespace between JSON values is fine but not required.
See [from_string] for the meaning of the optional arguments. *)
val stream_from_channel :
?buf:Buffer.t ->
?fin:(unit -> unit) ->
?fname:string ->
?lnum:int ->
in_channel -> t Stream.t
(** Input a sequence of JSON values from a channel.
Whitespace between JSON values is fine but not required.
@param fin finalization function executed once when the end of the
stream is reached either because there is no more input or because
the input could not be parsed, raising an exception.
@raise Finally When the parsing and the finalizer both raised, [Finally (exn, fin_exn)]
is raised, [exn] being the parsing exception and [fin_exn] the finalizer one.
See [from_string] for the meaning of the other optional arguments. *)
val stream_from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> t Stream.t
(** Input a sequence of JSON values from a file.
Whitespace between JSON values is fine but not required.
See [from_string] for the meaning of the optional arguments. *)
val stream_from_lexbuf :
lexer_state ->
?fin:(unit -> unit) ->
Lexing.lexbuf -> t Stream.t
(** Input a sequence of JSON values from a lexbuf.
A valid initial [lexer_state] can be created with [init_lexer].
Whitespace between JSON values is fine but not required.
@raise Finally When the parsing and the finalizer both raised, [Finally (exn, fin_exn)]
is raised, [exn] being the parsing exception and [fin_exn] the finalizer one.
See [stream_from_channel] for the meaning of the optional [fin]
argument. *)
type json_line = [ `Json of t | `Exn of exn ]
(** The type of values resulting from a parsing attempt of a JSON value. *)
val linestream_from_channel :
?buf:Buffer.t ->
?fin:(unit -> unit) ->
?fname:string ->
?lnum:int ->
in_channel -> json_line Stream.t
(** Input a sequence of JSON values, one per line, from a channel.
Exceptions raised when reading malformed lines are caught
and represented using [`Exn].
See [stream_from_channel] for the meaning of the optional [fin]
argument.
See [from_string] for the meaning of the other optional arguments. *)
val linestream_from_file :
?buf:Buffer.t ->
?fname:string ->
?lnum:int ->
string -> json_line Stream.t
(** Input a sequence of JSON values, one per line, from a file.
Exceptions raised when reading malformed lines are caught
and represented using [`Exn].
See [stream_from_channel] for the meaning of the optional [fin]
argument.
See [from_string] for the meaning of the other optional arguments. *)
val read_t : lexer_state -> Lexing.lexbuf -> t
(** Read a JSON value from the given lexer_state and lexing buffer and return it.
Provided as a reader function for atdgen.
*)
(**/**)
(* begin undocumented section *)
val finish_string : lexer_state -> Lexing.lexbuf -> string
val read_string : lexer_state -> Lexing.lexbuf -> string
val read_ident : lexer_state -> Lexing.lexbuf -> string
val map_string :
lexer_state -> (string -> int -> int -> 'a) -> Lexing.lexbuf -> 'a
(* equivalent to finish_string *)
val map_ident :
lexer_state -> (string -> int -> int -> 'a) -> Lexing.lexbuf -> 'a
(* equivalent to read_ident *)
type variant_kind = [ `Edgy_bracket | `Square_bracket | `Double_quote ]
val start_any_variant : lexer_state -> Lexing.lexbuf -> variant_kind
val finish_variant : lexer_state -> Lexing.lexbuf -> t option
val finish_skip_variant : lexer_state -> Lexing.lexbuf -> unit
val read_lt : lexer_state -> Lexing.lexbuf -> unit
val read_gt : lexer_state -> Lexing.lexbuf -> unit
val read_comma : lexer_state -> Lexing.lexbuf -> unit
val finish_stringlit : lexer_state -> Lexing.lexbuf -> string
val finish_skip_stringlit : lexer_state -> Lexing.lexbuf -> unit
val finish_escaped_char : lexer_state -> Lexing.lexbuf -> unit
val finish_comment : lexer_state -> Lexing.lexbuf -> unit
val read_space : lexer_state -> Lexing.lexbuf -> unit
val read_eof : Lexing.lexbuf -> bool
val read_null : lexer_state -> Lexing.lexbuf -> unit
val read_null_if_possible : lexer_state -> Lexing.lexbuf -> bool
val read_bool : lexer_state -> Lexing.lexbuf -> bool
val read_int : lexer_state -> Lexing.lexbuf -> int
val read_int8 : lexer_state -> Lexing.lexbuf -> char
val read_int32 : lexer_state -> Lexing.lexbuf -> int32
val read_int64 : lexer_state -> Lexing.lexbuf -> int64
val read_number : lexer_state -> Lexing.lexbuf -> float
val skip_ident : lexer_state -> Lexing.lexbuf -> unit
val read_sequence :
('a -> lexer_state -> Lexing.lexbuf -> 'a) ->
'a ->
lexer_state ->
Lexing.lexbuf -> 'a
val read_list :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a list
val read_list_rev :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a list
val read_array_end : Lexing.lexbuf -> unit
val read_array_sep : lexer_state -> Lexing.lexbuf -> unit
val read_array :
(lexer_state -> Lexing.lexbuf -> 'a) ->
lexer_state ->
Lexing.lexbuf -> 'a array
val read_tuple :
(int -> 'a -> lexer_state -> Lexing.lexbuf -> 'a) ->
'a ->
lexer_state ->
Lexing.lexbuf -> 'a
val start_any_tuple : lexer_state -> Lexing.lexbuf -> bool
val read_lpar : lexer_state -> Lexing.lexbuf -> unit
val read_rpar : lexer_state -> Lexing.lexbuf -> unit
val read_tuple_end : Lexing.lexbuf -> unit
val read_tuple_end2 : lexer_state -> bool -> Lexing.lexbuf -> unit
val read_tuple_sep : lexer_state -> Lexing.lexbuf -> unit
val read_tuple_sep2 : lexer_state -> bool -> Lexing.lexbuf -> unit
val read_lbr : lexer_state -> Lexing.lexbuf -> unit
val read_rbr : lexer_state -> Lexing.lexbuf -> unit
val read_fields :
('acc -> string -> lexer_state -> Lexing.lexbuf -> 'acc) ->
'acc ->
lexer_state ->
Lexing.lexbuf -> 'acc
val read_abstract_fields :
(lexer_state -> Lexing.lexbuf -> 'key) ->
('acc -> 'key -> lexer_state -> Lexing.lexbuf -> 'acc) ->
'acc ->
lexer_state ->
Lexing.lexbuf -> 'acc
val read_lcurl : lexer_state -> Lexing.lexbuf -> unit
val read_object_end : Lexing.lexbuf -> unit
val read_object_sep : lexer_state -> Lexing.lexbuf -> unit
val read_colon : lexer_state -> Lexing.lexbuf -> unit
val read_json : lexer_state -> Lexing.lexbuf -> t
val skip_json : lexer_state -> Lexing.lexbuf -> unit
val buffer_json : lexer_state -> Lexing.lexbuf -> unit
val validate_json : 'path -> t -> 'error option
(* always returns [None].
Provided so that atdgen users can write:
type t <ocaml module="Yojson.Safe"> = abstract
*)
(* end undocumented section *)
(**/**)
# 121 "yojson.cppo.mli"
end
(** {1 Supertype of all JSON tree types} *)
# 1 "type.ml"
(** {3 Type of the JSON tree} *)
type t =
[
| `Null
| `Bool of bool
# 8 "type.ml"
| `Int of int
# 11 "type.ml"
| `Intlit of string
# 14 "type.ml"
| `Float of float
# 17 "type.ml"
| `Floatlit of string
# 20 "type.ml"
| `String of string
# 23 "type.ml"
| `Stringlit of string
# 25 "type.ml"
| `Assoc of (string * t) list
| `List of t list
# 28 "type.ml"
| `Tuple of t list
# 31 "type.ml"
| `Variant of (string * t option)
# 33 "type.ml"
]
(**
All possible cases defined in Yojson:
- `Null: JSON null
- `Bool of bool: JSON boolean
- `Int of int: JSON number without decimal point or exponent.
- `Intlit of string: JSON number without decimal point or exponent,
preserved as a string.
- `Float of float: JSON number, Infinity, -Infinity or NaN.
- `Floatlit of string: JSON number, Infinity, -Infinity or NaN,
preserved as a string.
- `String of string: JSON string. Bytes in the range 128-255 are preserved
as-is without encoding validation for both reading
and writing.
- `Stringlit of string: JSON string literal including the double quotes.
- `Assoc of (string * json) list: JSON object.
- `List of json list: JSON array.
- `Tuple of json list: Tuple (non-standard extension of JSON).
Syntax: [("abc", 123)].
- `Variant of (string * json option): Variant (non-standard extension of JSON).
Syntax: [<"Foo">] or [<"Bar":123>].
*)
(*
Note to adventurers: ocamldoc does not support inline comments
on each polymorphic variant, and cppo doesn't allow to concatenate
comments, so it would be complicated to document only the
cases that are preserved by cppo in the type definition.
*)
# 1 "monomorphic.mli"
val pp : Format.formatter -> t -> unit
(** Pretty printer, useful for debugging *)
val show : t -> string
(** Convert value to string, useful for debugging *)
val equal : t -> t -> bool
(** [equal a b] is the monomorphic equality.
Determines whether two JSON values are considered equal. In the case of
JSON objects, the order of the keys does not matter, except for
duplicate keys which will be considered equal as long as they are in the
same input order.
*)
# 135 "yojson.cppo.mli"
type json_max = t
# 1 "write.mli"
(** {2 JSON writers} *)
val to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t -> string
(** Write a compact JSON value to a string.
@param buf allows to reuse an existing buffer created with
[Buffer.create]. The buffer is cleared of all contents
before starting and right before returning.
@param len initial length of the output buffer.
@param std use only standard JSON syntax,
i.e. convert tuples and variants into standard JSON (if applicable),
refuse to print NaN and infinities,
require the root node to be either an object or an array.
Default is [false].
*)
val to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t -> unit
(** Write a compact JSON value to a channel.
@param buf allows to reuse an existing buffer created with
[Buffer.create] on the same channel.
[buf] is flushed right
before [to_channel] returns but the [out_channel] is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_output :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
< output : string -> int -> int -> int; .. > -> t -> unit
(** Write a compact JSON value to an OO channel.
@param buf allows to reuse an existing buffer created with
[Buffer.add_channel] on the same channel.
[buf] is flushed right
before [to_output] returns but the channel itself is
not flushed automatically.
See [to_string] for the role of the other optional arguments. *)
val to_file :
?len:int ->
?std:bool ->
string -> t -> unit
(** Write a compact JSON value to a file.
See [to_string] for the role of the optional arguments. *)
val to_buffer :
?std:bool ->
Buffer.t -> t -> unit
(** Write a compact JSON value to an existing buffer.
See [to_string] for the role of the optional argument. *)
val stream_to_string :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
t Stream.t -> string
(** Write a newline-separated sequence of compact one-line JSON values to
a string.
See [to_string] for the role of the optional arguments. *)
val stream_to_channel :
?buf:Buffer.t ->
?len:int ->
?std:bool ->
out_channel -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a channel.
See [to_channel] for the role of the optional arguments. *)
val stream_to_file :
?len:int ->
?std:bool ->
string -> t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
a file.
See [to_string] for the role of the optional arguments. *)
val stream_to_buffer :
?std:bool ->
Buffer.t ->
t Stream.t -> unit
(** Write a newline-separated sequence of compact one-line JSON values to
an existing buffer.
See [to_string] for the role of the optional arguments. *)
val write_t : Buffer.t -> t -> unit
(** Write the given JSON value to the given buffer.
Provided as a writer function for atdgen.
*)
(** {2 Miscellaneous} *)
val sort : t -> t
(** Sort object fields (stable sort, comparing field names
and treating them as byte sequences) *)
(**/**)
(* begin undocumented section *)
val write_null : Buffer.t -> unit -> unit
val write_bool : Buffer.t -> bool -> unit
# 113 "write.mli"
val write_int : Buffer.t -> int -> unit
# 116 "write.mli"
val write_float : Buffer.t -> float -> unit
val write_std_float : Buffer.t -> float -> unit
val write_float_fast : Buffer.t -> float -> unit
val write_std_float_fast : Buffer.t -> float -> unit
val write_float_prec : int -> Buffer.t -> float -> unit
val write_std_float_prec : int -> Buffer.t -> float -> unit
# 124 "write.mli"
val write_string : Buffer.t -> string -> unit
# 128 "write.mli"
val write_intlit : Buffer.t -> string -> unit
# 131 "write.mli"
val write_floatlit : Buffer.t -> string -> unit
# 134 "write.mli"
val write_stringlit : Buffer.t -> string -> unit
# 137 "write.mli"
val write_assoc : Buffer.t -> (string * t) list -> unit
val write_list : Buffer.t -> t list -> unit
# 140 "write.mli"
val write_tuple : Buffer.t -> t list -> unit
val write_std_tuple : Buffer.t -> t list -> unit
# 144 "write.mli"
val write_variant : Buffer.t -> string -> t option -> unit
val write_std_variant : Buffer.t -> string -> t option -> unit
# 148 "write.mli"
val write_json : Buffer.t -> t -> unit
val write_std_json : Buffer.t -> t -> unit
(* end undocumented section *)
(**/**)
# 1 "write2.mli"
(** {2 JSON pretty-printing} *)
val pretty_print : ?std:bool -> Format.formatter -> t -> unit
(** Pretty-print into a {!Format.formatter}.
See [to_string] for the role of the optional [std] argument.
@since 1.3.1 *)
val pretty_to_string : ?std:bool -> t -> string
(** Pretty-print into a string.
See [to_string] for the role of the optional [std] argument.
*)
val pretty_to_channel : ?std:bool -> out_channel -> t -> unit
(** Pretty-print to a channel.
See [to_string] for the role of the optional [std] argument.
*)