Json
Efficient JSON encoding using JavaScript API
see MDN
t
type t =
| Boolean(bool)
| Null
| String(string)
| Number(float)
| Object(Js.Dict.t<t>)
| Array(array<t>)The JSON data structure
tagged_t
type tagged_t =
| JSONFalse
| JSONTrue
| JSONNull
| JSONString(string)
| JSONNumber(float)
| JSONObject(Js_dict.t<t>)
| JSONArray(array<t>)classify
let classify: t => tagged_ttest
let test: ('a, Kind.t<'b>) => booltest(v, kind) returns true if v is of kind.
decodeString
let decodeString: t => option<Js_string.t>decodeString(json) returns Some(s) if json is a string, None otherwise.
decodeNumber
let decodeNumber: t => option<float>decodeNumber(json) returns Some(n) if json is a number, None otherwise.
decodeObject
let decodeObject: t => option<Js_dict.t<t>>decodeObject(json) returns Some(o) if json is an object, None otherwise.
decodeArray
let decodeArray: t => option<array<t>>decodeArray(json) returns Some(a) if json is an array, None otherwise.
decodeBoolean
let decodeBoolean: t => option<bool>decodeBoolean(json) returns Some(b) if json is a boolean, None otherwise.
decodeNull
let decodeNull: t => option<Js_null.t<'a>>decodeNull(json) returns Some(null) if json is a null, None otherwise.
null
let null: tnull is the singleton null JSON value.
string
let string: string => tstring(s) makes a JSON string of the string s.
number
let number: float => tnumber(n) makes a JSON number of the float n.
boolean
let boolean: bool => tboolean(b) makes a JSON boolean of the bool b.
object_
let object_: Js_dict.t<t> => tobject_(dict) makes a JSON object of the Js.Dict.t dict.
array
let array: array<t> => tarray_(a) makes a JSON array of the Js.Json.t array a.
stringArray
let stringArray: array<string> => tstringArray(a) makes a JSON array of the string array a.
numberArray
let numberArray: array<float> => tnumberArray(a) makes a JSON array of the float array a.
booleanArray
let booleanArray: array<bool> => tbooleanArray(a) makes a JSON array of the bool array a.
objectArray
let objectArray: array<Js_dict.t<t>> => tobjectArray(a) makes a JSON array of the JsDict.tarraya`.
parseExn
let parseExn: string => tparseExn(s) parses the string s into a JSON data structure.
Returns a JSON data structure.
Raises SyntaxError if the given string is not a valid JSON. Note: SyntaxError is a JavaScript exception.
See parse on MDN.
Examples
RESCRIPT/* parse a simple JSON string */
let json = try Js.Json.parseExn(` "hello" `) catch {
| _ => failwith("Error parsing JSON string")
}
switch Js.Json.classify(json) {
| Js.Json.JSONString(value) => Js.log(value)
| _ => failwith("Expected a string")
}
RESCRIPT/* parse a complex JSON string */
let getIds = s => {
let json = try Js.Json.parseExn(s) catch {
| _ => failwith("Error parsing JSON string")
}
switch Js.Json.classify(json) {
| Js.Json.JSONObject(value) =>
/* In this branch, compiler infer value : Js.Json.t Js.Dict.t */
switch Js.Dict.get(value, "ids") {
| Some(ids) =>
switch Js.Json.classify(ids) {
| Js.Json.JSONArray(ids) => /* In this branch compiler infer ids : Js.Json.t array */
ids
| _ => failwith("Expected an array")
}
| None => failwith("Expected an `ids` property")
}
| _ => failwith("Expected an object")
}
}
/* prints `1, 2, 3` */
Js.log(getIds(` { "ids" : [1, 2, 3 ] } `))
stringify
let stringify: t => stringstringify(json) formats the JSON data structure as a string.
Returns the string representation of a given JSON data structure.
See stringify on MDN.
Examples
RESCRIPT/* Creates and stringifies a simple JS object */
let dict = Js.Dict.empty()
Js.Dict.set(dict, "name", Js.Json.string("John Doe"))
Js.Dict.set(dict, "age", Js.Json.number(30.0))
Js.Dict.set(dict, "likes", Js.Json.stringArray(["ReScript", "ocaml", "js"]))
Js.log(Js.Json.stringify(Js.Json.object_(dict)))
stringifyWithSpace
let stringifyWithSpace: (t, int) => stringstringifyWithSpace(json) formats the JSON data structure as a string.
Returns the string representation of a given JSON data structure with spacing.
See stringify on MDN.
Examples
RESCRIPT/* Creates and stringifies a simple JS object with spacing */
let dict = Js.Dict.empty()
Js.Dict.set(dict, "name", Js.Json.string("John Doe"))
Js.Dict.set(dict, "age", Js.Json.number(30.0))
Js.Dict.set(dict, "likes", Js.Json.stringArray(["ReScript", "ocaml", "js"]))
Js.log(Js.Json.stringifyWithSpace(Js.Json.object_(dict), 2))
stringifyAny
let stringifyAny: 'a => option<string>stringifyAny(value) formats any value into a JSON string.
Examples
RESCRIPT/* prints `["hello", "world"]` */
Js.log(Js.Json.stringifyAny(["hello", "world"]))
deserializeUnsafe
let deserializeUnsafe: string => 'aBest-effort serialization, it tries to seralize as many objects as possible and deserialize it back
It is unsafe in two aspects
It may throw during parsing
when you cast it to a specific type, it may have a type mismatch
serializeExn
let serializeExn: 'a => stringIt will raise in such situations:
The object can not be serlialized to a JSON
There are cycles
Some JS engines can not stringify deeply nested json objects