sig
  type t
  type _ kind =
      String : Js_string.t Js_json.kind
    | Number : float Js_json.kind
    | Object : Js_json.t Js_dict.t Js_json.kind
    | Array : Js_json.t array Js_json.kind
    | Boolean : bool Js_json.kind
    | Null : Js_types.null_val Js_json.kind
  type tagged_t =
      JSONFalse
    | JSONTrue
    | JSONNull
    | JSONString of string
    | JSONNumber of float
    | JSONObject of Js_json.t Js_dict.t
    | JSONArray of Js_json.t array
  val classify : Js_json.t -> Js_json.tagged_t
  val test : '-> 'Js_json.kind -> bool
  val decodeString : Js_json.t -> Js_string.t option
  val decodeNumber : Js_json.t -> float option
  val decodeObject : Js_json.t -> Js_json.t Js_dict.t option
  val decodeArray : Js_json.t -> Js_json.t array option
  val decodeBoolean : Js_json.t -> bool option
  val decodeNull : Js_json.t -> 'Js_null.t option
  external null : Js_json.t = "" "BS-EXTERNAL"
  external string : string -> Js_json.t = "%identity"
  external number : float -> Js_json.t = "%identity"
  external boolean : bool -> Js_json.t = "%identity"
  external object_ : Js_json.t Js_dict.t -> Js_json.t = "%identity"
  external array : Js_json.t array -> Js_json.t = "%identity"
  external stringArray : string array -> Js_json.t = "%identity"
  external numberArray : float array -> Js_json.t = "%identity"
  external booleanArray : bool array -> Js_json.t = "%identity"
  external objectArray : Js_json.t Js_dict.t array -> Js_json.t = "%identity"
  external parseExn : string -> Js_json.t = "parse" "BS-EXTERNAL"
  external stringify : Js_json.t -> string = "stringify" "BS-EXTERNAL"
  external stringifyWithSpace : Js_json.t -> int -> string = "stringify"
    "BS-EXTERNAL"
  external stringifyAny : '-> string option = "stringify" "BS-EXTERNAL"
end