json
JavaScript Object Notation (JSON)
JSON is a structured data-type within Murex. It is the standard format for all structured data within Murex however other formats such as YAML, TOML and CSV are equally first class citizens.
Example JSON document taken from Wikipedia
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 27,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021-3100"
},
"phoneNumbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "office",
"number": "646 555-4567"
},
{
"type": "mobile",
"number": "123 456-7890"
}
],
"children": [],
"spouse": null
}
One of the drawbacks (or maybe advantages, depending on your perspective) of JSON is that parsers generally expect a complete file for processing in that the JSON specification requires closing tags for every opening tag. This means it’s not always suitable for streaming. For example
» ja [1..3] -> foreach i { out ({ "$i": $i }) }
{ "1": 1 }
{ "2": 2 }
{ "3": 3 }
What does this even mean and how can you build a JSON file up sequentially?
One answer if to write the output in a streaming file format and convert back to JSON
» ja [1..3] -> foreach i { out (- "$i": $i) }
- "1": 1
- "2": 2
- "3": 3
» ja [1..3] -> foreach i { out (- "$i": $i) } -> cast yaml -> format json
[
{
"1": 1
},
{
"2": 2
},
{
"3": 3
}
]
What if I’m returning an object rather than writing one?
The problem with building JSON structures from existing structures is that you can quickly end up with invalid JSON due to the specifications strict use of commas.
For example in the code below, each item block is it’s own object and there are no [ ... ]
encapsulating them to denote it is an array of objects, nor are the objects terminated by a comma.
» config -> [ shell ] -> formap k v { $v -> alter /Foo Bar }
{
"Data-Type": "bool",
"Default": true,
"Description": "Display the interactive shell's hint text helper. Please note, even when this is disabled, it will still appear when used for regexp searches and other readline-specific functions",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
}
{
"Data-Type": "block",
"Default": "{ progress $PID }",
"Description": "Murex function to execute when an `exec` process is stopped",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": "{ progress $PID }"
}
{
"Data-Type": "bool",
"Default": true,
"Description": "ANSI escape sequences in Murex builtins to highlight syntax errors, history completions, {SGR} variables, etc",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
}
...
Luckily JSON also has it’s own streaming format: JSON lines (jsonl
). We can cast
this output as jsonl
then format
it back into valid JSON:
» config -> [ shell ] -> formap k v { $v -> alter /Foo Bar } -> cast jsonl -> format json
[
{
"Data-Type": "bool",
"Default": true,
"Description": "Write shell history (interactive shell) to disk",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
},
{
"Data-Type": "int",
"Default": 4,
"Description": "Maximum number of lines with auto-completion suggestions to display",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": "6"
},
{
"Data-Type": "bool",
"Default": true,
"Description": "Display some status information about the stop process when ctrl+z is pressed (conceptually similar to ctrl+t / SIGINFO on some BSDs)",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
},
...
foreach
will automatically cast it’s output as jsonl
if it’s stdin type is json
» ja [Tom,Dick,Sally] -> foreach name { out Hello $name }
Hello Tom
Hello Dick
Hello Sally
» ja [Tom,Dick,Sally] -> foreach name { out Hello $name } -> debug -> [[ /Data-Type/Murex ]]
jsonl
» ja [Tom,Dick,Sally] -> foreach name { out Hello $name } -> format json
[
"Hello Tom",
"Hello Dick",
"Hello Sally"
]
json
application/json
application/x-json
text/json
text/x-json
Marshal()
Writes minified JSON when no TTY detected and human readable JSON when stdout is a TTYReadArray()
Works with JSON arrays. Maps are converted into arraysReadArrayWithType()
Works with JSON arrays. Maps are converted into arrays. Elements data-type in Murex mirrors the JSON type of the elementReadIndex()
Works against all properties in JSONReadMap()
Works with JSON mapsReadNotIndex()
Works against all properties in JSONUnmarshal()
SupportedWriteArray()
Works with JSON arrayscast
): Alters the data-type of the previous function without altering its output[[ Element ]]
): Outputs an element from a nested structureopen
): Open a file with a preferred handlerformat
): Reformat one data-type into another data-typeruntime
): Returns runtime information on the internal state of Murexhcl
: HashiCorp Configuration Language (HCL)jsonc
: Concatenated JSONjsonl
: JSON Linestoml
: Tom’s Obvious, Minimal Language (TOML)yaml
: YAML Ain’t Markup Language (YAML)ReadIndex()
(type): Data type handler for the index, [
, builtinReadNotIndex()
(type): Data type handler for the bang-prefixed index, ![
, builtinReadArray()
(type): Read from a data type one array element at a timeWriteArray()
(type): Write a data type, one array element at a timeReadMap()
(type): Treat data type as a key/value structure and read its contentsMarshal()
(type): Converts structured memory into a structured file format (eg for stdio)Unmarshal()
(type): Converts a structured file format into structured memoryThis document was generated from builtins/types/json/json_doc.yaml.
This site's content is rebuilt automatically from murex's source code after each merge to the master
branch. Downloadable murex binaries are also built with the website.
Last built on Tue Dec 10 22:56:57 UTC 2024 against commit 60f05a260f05a227caf73dd5b3478e3cb3f4bb24e46745b.
Current version is 6.4.1005 (develop) which has been verified against tests cases.