Module Jsonm.Uncut

Codec with comments and whitespace.

The uncut codec also processes whitespace and JavaScript comments. The latter is non-standard JSON, fail on `Comment decoding if you want to process whitespace but stick to the standard.

The uncut codec preserves as much of the original input as possible. Perfect round-trip with Jsonm is however impossible for the following reasons:

Uncut data model

The uncut data model is the same as the regular data model, except that before or after any lexeme you may decode/encode one or more:

  • `White w, representing JSON whitespace w. On input the sequence CR (U+000D) and CRLF (<U+000A, U+000A>) are normalized to U+000A. The string w must be a sequence of U+0020, U+0009, U+000A or U+000D characters (' ', '\t', '\n', '\r').
  • `Comment (`S, c), representing a JavaScript single line comment c. c is the comment's content without the starting // and the ending newline. The string c must not contain any newline.
  • `Comment (`M, c), representing a JavaScript multi-line comment c. c is the comment's content without the starting /* and the ending */. The string c must not contain the sequence */.

Warning. Encode does not check the above constraints on w and c.

Decode

val decode : decoder -> [ `Await | `Lexeme of lexeme | `White of string | `Comment of [ `S | `M ] * string | `End | `Error of error ]

decode d is like Decode but for the uncut data model.

val pp_decode : Stdlib.Format.formatter -> [< `Await | `Lexeme of lexeme | `White of string | `Comment of [ `S | `M ] * string | `End | `Error of error ] -> unit

pp_decode ppf v prints an unspecified representation of v on ppf.

Encode

val encode : encoder -> [< `Await | `Lexeme of lexeme | `White of string | `Comment of [ `S | `M ] * string | `End ] -> [ `Ok | `Partial ]

encode is like Encode but for the uncut data model.

IMPORTANT. Never encode `Comment for the web, it is non-standard and breaks interoperability.