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 : Js.boolean 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 reifyType : Js_json.t -> 'Js_json.kind * 'b
  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 -> Js.boolean 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 : Js.boolean -> 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 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 : Js.boolean array -> Js_json.t = "%identity"
  external objectArray : Js_json.t Js_dict.t array -> Js_json.t = "%identity"
  external parse : string -> Js_json.t = "parse" "BS-EXTERNAL"
  external parseExn : string -> Js_json.t = "parse" "BS-EXTERNAL"
  external stringify : Js_json.t -> string = "stringify" "BS-EXTERNAL"
  external stringifyAny : '-> string option = "stringify" "BS-EXTERNAL"
end