slug.json
slug.json — JSON encoding and decoding
A pure Slug implementation of JSON serialisation and deserialisation conforming to RFC 8259.
Type mapping
| Slug type | JSON type | Notes |
|---|---|---|
@str | string | |
@num | number | |
@bool | boolean | |
nil | null | |
@list | array | |
@map | object | keys serialised as strings; sorted |
@sym | string | symbol label used as string value |
@bytes | string | encoded as "b64:<base64>" prefix string |
Key handling
Object keys are always serialised as strings. Both symbol keys (:name) and string keys ("name") are supported on encode. On decode, all object keys are returned as string keys — use dot access (m.name) or string bracket access (m["name"]) to read decoded values.
Bytes encoding
@bytes values are encoded as "b64:<base64>" strings. On decode, any string with this prefix is automatically decoded back to @bytes.
TOC
Functions
decode(jsonStr)
fn slug.json#decode(@str jsonStr) -> ?
decodes a JSON string into a Slug value.
Object keys are always decoded as string keys. Use dot access (m.name) or string bracket access (m["name"]) to read fields — never symbol bracket access (m[:name]).
Strings with the b64: prefix are decoded to @bytes values. Throws JsonError on malformed input.
| Parameter | Type | Default |
|---|---|---|
jsonStr | @str | — |
Throws: @struct(Error{type:JsonError})
Examples
decode(""hello"") // => "hello"
decode("42") // => 42
decode("true") // => true
decode("false") // => false
decode("null") // => nil
decode("[1,2,3]") // => [1, 2, 3]
decode(""b64:Zm9v"") // => 0x"666f6f"
decode("{"name":"Alice","age":30}") // => {name: Alice, age: 30}
encode(v)
fn slug.json#encode(v) -> @str
encodes a Slug value as a compact JSON string.
Map keys are sorted alphabetically. Symbols are encoded as their label string. Bytes are encoded as "b64:<base64>". Structs are not supported and will throw JsonError.
| Parameter | Type | Default |
|---|---|---|
v | — |
Throws: @struct(Error{type:JsonError})
Examples
encode("hello") // => ""hello""
encode(42) // => "42"
encode(true) // => "true"
encode(false) // => "false"
encode(nil) // => "null"
encode(0x"ff") // => ""b64:/w==""
encode([1, 2, 3]) // => "[1,2,3]"
encode({:type: :fn, :age: 30}) // => "{"age":30,"type":"fn"}"
encode({:name: Alice, :age: 30}) // => "{"age":30,"name":"Alice"}"
encode({name: Alice, age: 30}) // => "{"age":30,"name":"Alice"}"
pretty(v, indent)
fn slug.json#pretty(v, @num indent = 2) -> @str
encodes a Slug value as a pretty-printed JSON string.
The indent parameter controls the number of spaces per indentation level. Follows the same type mapping as encode.
| Parameter | Type | Default |
|---|---|---|
v | — | |
indent | @num | 2 |
Throws: @struct(Error{type:JsonError})
Examples
pretty("hello", 2) // => ""hello""
pretty([1, 2, 3], 4) // => "[
1,
2,
3
]"
pretty(0x"ff", 2) // => ""b64:/w==""
pretty({:type: :fn, :age: 30}, 2) // => "{
"age": 30,
"type": "fn"
}"
pretty({:name: Alice, :age: 30}, 2) // => "{
"age": 30,
"name": "Alice"
}"
pretty({name: Alice, age: 30}, 2) // => "{
"age": 30,
"name": "Alice"
}"