API Reference
JSON codec. A number with neither fraction nor exponent decodes to
Int, every other number to Float; object keys are byte-sorted,
so stringify of a parsed document is canonical whatever order the
document used.
fn asMap(value: Any): Map<String, Any>View a parsed object handle as a Map. The wrapper takes the
handle over, so the document is freed when the wrapper goes out of
scope: wrap a handle once and stop reading the value it came
from. Reads behave as on a map from parseObject, and a handle
read out of a nested object keeps the shared document alive on
its own.
value — an object handle from `parse` or `Map.get`.
returns — a map over the same object.
throws — aborts with `json object expected` when value is not a parsed object handle, `null` included.
import { JSON } from "@std/json";
let doc: Any = JSON.parse("\{\"ok\": true}");
let view = JSON.asMap(doc);
print(view.get("ok"));fn parse(text: String): AnyParse a JSON document. Any value may sit at the top level: null,
true, false, a number, a string, an array, or an object.
Arrays become Array<Any>, objects become opaque handles, and a
handle is read with asMap or by parsing with parseObject.
String escapes decode to the characters they name, control bytes
must be escaped in the document, and a repeated key keeps its
last value.
Given a type argument, parse<T> reads an object document
straight into a Record or Class T without building intermediate
values; JSON.decode<T> is the same call under a second name.
T must be a struct or class with at least one field and no
custom init. Document keys are matched against declared fields
in any order, unknown keys are skipped, missing keys decode as
null, and field types are not checked against the document, so
declare a field as Any when the value can be an object or an
array.
text — JSON source text.
returns — the decoded value as `Any`, or a `T` when a type argument is given.
throws — aborts with `json parse error: <reason> at offset <n>` on malformed input or text trailing the top-level value, and with `json max depth exceeded` past 64 levels of nesting. `parse<T>` aborts with `typed decode needs a JSON object` when the document root is not an object.
import { JSON } from "@std/json";
struct Point {
let x: Int = 0;
let y: Int = 0;
}
let doc: Any = JSON.parse("\{\"b\": 2, \"a\": 1}");
print(JSON.stringify(doc));
let p = JSON.parse<Point>("\{\"y\": 7, \"x\": 3}");
print(p.x);fn parseObject(text: String): Map<String, Any>Parse a JSON object document straight into a Map. The map owns
the parsed tree, so the document is freed when the map goes out of
scope. Fields are read with get, has, len, keys and
values, and keys arrive in byte-sorted order.
text — a JSON object document.
returns — a map over the parsed document.
throws — aborts with `json parse error: <reason> at offset <n>` on malformed input and with `json object expected` when the document root is not an object.
import { JSON } from "@std/json";
let m = JSON.parseObject("\{\"count\": 42, \"name\": \"rasmalai\"}");
print(m.get("name"));
print(m.len());fn stringify(value: Any): StringRender a value as canonical JSON: no spaces, object keys in
byte-sorted order, " and \ escaped, and control characters
written as \n, \r, \t, \b, \f or \u00xx. Floats that
are not finite render as null, and so does any value that is not
JSON: a Map or class instance is not a document, so stringify
the values read out of it instead.
value — a scalar, a parsed array, a parsed object handle, or a value read out of one.
returns — the JSON text.
throws — aborts past 64 levels of nesting while writing.
import { JSON } from "@std/json";
let doc: Any = JSON.parse("\{\"q\": \"a\\\"b\", \"t\": \"x\\ty\"}");
print(JSON.stringify(doc));fn stringifyInto(value: Any, buf: ByteBuffer, pos: Int): IntRender a value as canonical JSON straight into a byte buffer,
skipping the intermediate String. The output and the escaping
match stringify.
value — a scalar, a parsed array, a parsed object handle, or a value read out of one.
buf — destination buffer.
pos — first byte to write; must lie inside the buffer.
returns — bytes written, not counting `pos`.
throws — aborts with `byte buffer out of bounds` when the buffer cannot hold the output from `pos`, and past 64 levels of nesting.
import { JSON } from "@std/json";
import { ByteBuffer } from "@std/bytes";
let buf = ByteBuffer.allocate(32);
let n = JSON.stringifyInto(JSON.parse("\{\"a\": 1}"), buf, 0);
print(buf.readString(0, n));