Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

json

The json module provides JSON serialization and deserialization. json::read uses type-directed deserialization — the target type is inferred from the type annotation at the call site.

/// Parse JSON from a string or bytes.
///
/// To parse a stream, read it first — `json::read(Read::read_all(f)?)`.
val read: fn(input: [string, bytes]) -> Result<'b, [`JsonErr(string), `InvalidCast(string)]>;

/// Serialize a value to a JSON string.
val write_str: fn(?#pretty: bool, value: Any) -> Result<string, `JsonErr(string)>;

/// Serialize a value to JSON bytes.
///
/// To write to a stream, write the bytes — `Write::write_exact(f, json::write_bytes(v)?)`.
val write_bytes: fn(?#pretty: bool, value: Any) -> Result<bytes, `JsonErr(string)>;

Parsing takes bytes or a string, so parsing from a stream is reading the stream (sys::io):

use sys::io::{Read, Write};

let f = sys::fs::open(`Read, path)?;
let user: {name: string, age: i64} = json::read(Read::read_all(f)?)?;

let out = sys::tcp::connect(addr)?;
Write::write_exact(out, json::write_bytes(user)?)?

Type-directed deserialization

The return type of json::read is determined by the type annotation on the binding. The compiler resolves the concrete type at compile time and generates the appropriate deserialization code.


let n: i64 = json::read("42")?;
let s: string = json::read("\"hello\"")?;
let user: {name: string, age: i64} = json::read("{\"name\": \"Alice\", \"age\": 30}")?;
let items: Array<{id: i64, label: string}> = json::read(data)?;
let maybe: [string, null] = json::read(data)?;