---
slug: ./Json
title: "ClikaRT::json::Json"
sidebar_label: "Json"
description: "A JSON value: null, boolean, number, string, array, or object. Copyable (deep) and movable."
---

<!-- Generated by tools/doxygen2mdx from Doxygen XML. Do not edit. -->

<span class="api-kind api-kind--class">class</span>

**Header:** `ClikaRT/json/json.h`

A JSON value: null, boolean, number, string, array, or object. Copyable (deep) and movable. (A JSON object is the string-keyed map, what Python calls a dict at the boundary.)

Read a parsed value with the `is_*` predicates and the typed getters ([`as_string`](./Json.md#as_string) / [`as_int64`](./Json.md#as_int64) / [`as_double`](./Json.md#as_double) / [`as_bool`](./Json.md#as_bool)), walk an object with [`for_each_member`](./Json.md#for_each_member), and index an array or object with [`at`](./Json.md#at). Build a value with the factories ([`object`](./Json.md#object) / [`array`](./Json.md#array): nullary, or from a braced literal: [`Json::object`](./Json.md#object)`({{"model", "m"}, {"n", 1}})`), `operator[]` (auto-vivifies an object member), [`push_back`](./Json.md#push_back), and assignment (`v["k"] = 42`). Serialize with [`dump`](./Json.md#dump).

## Nested types

| Name | Description |
| --- | --- |
| [`Element`](./Json.Element.md) | An element inside a [`Json::array`](./Json.md#array)`({...})` literal. Built implicitly from the bare value (`1`, `"two"`, `true`, [`Json::object`](./Json.md#object)`({...})`); the implicit constructors are deliberate: the braced literal is this type's whole entry point. |
| [`Member`](./Json.Member.md) | A key/value pair inside a [`Json::object`](./Json.md#object)`({...})` literal. Built implicitly from the braced pair (`{"`[`key`](./Json.Member.md#key)`", `[`value`](./Json.Member.md#value)`}`); the implicit constructors are deliberate: the braced literal is this type's whole entry point. [`key`](./Json.Member.md#key) is a non-owning view; keep its backing alive for the call (a string literal is fine). |

## Static member functions

### parse() {#parse}

<div class="api-signature">

`static` [`Json`](./Json.md) **`parse`**(`std::string_view` `text`)

</div>

Parse JSON text. Malformed input raises [`ClikaRT::Error`](../Error.md). `text` is read during the call, not retained.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 71

</div>

### read\_file() {#read_file}

<div class="api-signature">

`static` [`Json`](./Json.md) **`read_file`**(`std::string_view` `path`)

</div>

Read and parse a JSON file. A missing/unreadable file or malformed JSON raises [`ClikaRT::Error`](../Error.md). `path` is copied, not retained as a view.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 75

</div>

### object() {#object}

<div class="api-signature">

`static` [`Json`](./Json.md) **`object`**()

</div>

An empty object / array, ready to populate.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 82

</div>

### array() {#array}

<div class="api-signature">

`static` [`Json`](./Json.md) **`array`**()

</div>

An empty array value.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 84

</div>

### object(initializer\_list\<Member\>) {#object-2}

<div class="api-signature">

`static` [`Json`](./Json.md) **`object`**(`std::initializer_list<`[`Member`](./Json.Member.md)`>` `members`)

</div>

An object built from a braced member list: [`Json::object`](./Json.md#object)`({{"model", "m"}, {"n", 1}})`. [Scalar](../Scalar.md) values deduce their JSON type exactly as assignment (`obj["k"] = v`) does; nest with the factories themselves (`{"cfg", `[`Json::object`](./Json.md#object)`({...})}`). Members are deep-copied out of the list (an `initializer_list`'s elements are const by construction), sized for config-scale payloads, per this file's focused-surface scope. An empty list yields [`Json::object()`](./Json.md#object).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 99

</div>

### array(initializer\_list\<Element\>) {#array-2}

<div class="api-signature">

`static` [`Json`](./Json.md) **`array`**(`std::initializer_list<`[`Element`](./Json.Element.md)`>` `values`)

</div>

An array built from a braced element list: [`Json::array`](./Json.md#array)`({1, "two", true})`. Same scalar deduction and deep-copy behavior as [`object`](./Json.md#object)`({...})`; an empty list yields [`Json::array()`](./Json.md#array).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 103

</div>

## Member functions

### Json() {#Json}

<div class="api-signature">

**`Json`**()

</div>

A JSON null.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 46

</div>

### Json(bool) {#Json-2}

<div class="api-signature">

`explicit` **`Json`**(`bool` `value`)

</div>

[Scalar](../Scalar.md) values. Explicit so a bare scalar never silently becomes a [`Json`](./Json.md) in an unrelated overload; build one deliberately ([`Json`](./Json.md)`(std::int64_t{0})`) or assign through a member (`obj["n"] = 0`).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 51

</div>

### Json(int64\_t) {#Json-3}

<div class="api-signature">

`explicit` **`Json`**(`std::int64_t` `value`)

</div>

An integer value.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 53

</div>

### Json(double) {#Json-4}

<div class="api-signature">

`explicit` **`Json`**(`double` `value`)

</div>

A floating-point value.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 55

</div>

### Json(string\_view) {#Json-5}

<div class="api-signature">

`explicit` **`Json`**(`std::string_view` `value`)

</div>

A string value (copied).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 57

</div>

### Json(char) {#Json-6}

<div class="api-signature">

`explicit` **`Json`**(`const char*` `value`)

</div>

A string value (copied); disambiguates string literals.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 59

</div>

### Json(Json) {#Json-7}

<div class="api-signature">

**`Json`**(`const Json&` `other`)

</div>

Copy: a deep, independent copy of the document.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 62

</div>

### Json(Json) {#Json-8}

<div class="api-signature">

**`Json`**(`Json&&` `other`) `noexcept`

</div>

Move: transfers the document; `other` is left null.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 64

</div>

### \~Json() {#Json-9}

<div class="api-signature">

**`~Json`**()

</div>

Releases the document.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 66

</div>

### write\_file() {#write_file}

<div class="api-signature">

`void` **`write_file`**(`std::string_view` `path`, `int` `indent` `=` `2`) `const`

</div>

Serialize to `path` (parent directories are created). `indent < 0` writes a compact single line. `path` is copied, not retained.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 79

</div>

### operator\[\]() {#operator-subscript}

<div class="api-signature">

[`Json`](./Json.md)`&` **`operator[]`**(`std::string_view` `key`)

</div>

Object member by key, auto-vivifying: turns a null into an object and inserts an absent key as null. The returned reference writes through into this value, so `obj["a"]["b"] = 1` and `obj["k"] = "v"` build nested structure. Valid while this [`Json`](./Json.md) is alive. (For a read-only lookup that does not mutate, use `at(key)`.)

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 112

</div>

### push\_back() {#push_back}

<div class="api-signature">

`void` **`push_back`**([`Json`](./Json.md) `value`)

</div>

Append `value` to an array, turning a null into an array first.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 115

</div>

### operator=(Json) {#operator-assign}

<div class="api-signature">

[`Json`](./Json.md)`&` **`operator=`**(`const` [`Json`](./Json.md)`&` `other`)

</div>

Assign a JSON value into this slot (write-through for an `operator[]` reference).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 119

</div>

### operator=(Json) {#operator-assign-2}

<div class="api-signature">

[`Json`](./Json.md)`&` **`operator=`**([`Json`](./Json.md)`&&` `other`) `noexcept`

</div>

Move-assign: transfers the document; `other` is left null.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 121

</div>

### operator=(T) {#operator-assign-3}

<div class="api-signature">

`template <``typename T`, `std::enable_if_t<!std::is_same_v<std::remove_cv_t<std::remove_reference_t<T>>,` [`Json`](./Json.md)`>, int>` `=` `0``>`<br />[`Json`](./Json.md)`&` **`operator=`**(`T&&` `value`)

</div>

Assign a scalar (`v = true`, `v = 42`, `v = 3.14`, `v = "text"`). Deduces the JSON type from the argument; an unsupported type fails to compile.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 127

</div>

### is\_null() {#is_null}

<div class="api-signature">

`bool` **`is_null`**() `const`

</div>

True for the null value.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 144

</div>

### is\_boolean() {#is_boolean}

<div class="api-signature">

`bool` **`is_boolean`**() `const`

</div>

True for a boolean.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 146

</div>

### is\_number() {#is_number}

<div class="api-signature">

`bool` **`is_number`**() `const`

</div>

integer or floating-point

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 147

</div>

### is\_string() {#is_string}

<div class="api-signature">

`bool` **`is_string`**() `const`

</div>

True for a string.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 149

</div>

### is\_array() {#is_array}

<div class="api-signature">

`bool` **`is_array`**() `const`

</div>

True for an array.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 151

</div>

### is\_object() {#is_object}

<div class="api-signature">

`bool` **`is_object`**() `const`

</div>

True for an object.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 153

</div>

### contains() {#contains}

<div class="api-signature">

`bool` **`contains`**(`std::string_view` `key`) `const`

</div>

True if this is an object containing `key`.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 156

</div>

### size() {#size}

<div class="api-signature">

`std::size_t` **`size`**() `const`

</div>

Number of members (object) / elements (array); 0 for a scalar or null.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 158

</div>

### as\_string() {#as_string}

<div class="api-signature">

`std::string` **`as_string`**() `const`

</div>

The value as the requested type. A type mismatch (e.g. [`as_string`](./Json.md#as_string) on a number) raises [`ClikaRT::Error`](../Error.md).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 163

</div>

### as\_int64() {#as_int64}

<div class="api-signature">

`std::int64_t` **`as_int64`**() `const`

</div>

The value as a signed 64-bit integer (any JSON number reads through).

**Throws**

- `ClikaRT::Error`: (InvalidArgument) when the value is not a number.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 167

</div>

### as\_double() {#as_double}

<div class="api-signature">

`double` **`as_double`**() `const`

</div>

The value as a `double` (any JSON number reads through).

**Throws**

- `ClikaRT::Error`: (InvalidArgument) when the value is not a number.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 171

</div>

### as\_bool() {#as_bool}

<div class="api-signature">

`bool` **`as_bool`**() `const`

</div>

The value as a boolean.

**Throws**

- `ClikaRT::Error`: (InvalidArgument) when the value is not a boolean.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 175

</div>

### for\_each\_member() {#for_each_member}

<div class="api-signature">

`void` **`for_each_member`**(<br />
&nbsp;&nbsp;&nbsp;&nbsp;`const std::function<void(std::string_view key, const` [`Json`](./Json.md)`&value)>&` `visit`<br />
) `const`

</div>

Visit each member of an object in insertion order. `key` and `value` are valid only during the call (do not retain them). A no-op on a non-object.

A throw from `visit` is contained HERE, in your own TU / runtime, never unwinding through the library frame (a cross-runtime unwind into the Release `.so`'s static C++ runtime terminates), and stops the walk, and surfaces as the raised [`ClikaRT::Error`](../Error.md) / returned failure. To stop the walk early WITHOUT an error, use [`for_each_member_while`](./Json.md#for_each_member_while). An empty `visit` is refused ([`Status::InvalidArgument`](../../index.md#Status)) before the walk.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 187

</div>

### for\_each\_member\_while() {#for_each_member_while}

<div class="api-signature">

`void` **`for_each_member_while`**(<br />
&nbsp;&nbsp;&nbsp;&nbsp;`const std::function<bool(std::string_view key, const` [`Json`](./Json.md)`&value)>&` `visit`<br />
) `const`

</div>

The abort-capable sibling: `visit` returns `false` to stop the walk early (a clean stop, not an error). A throw is contained, and an empty `visit` refused, exactly as in [`for_each_member`](./Json.md#for_each_member).

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 198

</div>

### at(string\_view) {#at}

<div class="api-signature">

[`Json`](./Json.md) **`at`**(`std::string_view` `key`) `const`

</div>

Object member by key (a read-only copy). Raises [`ClikaRT::Error`](../Error.md) (NotFound) when this is not an object or the key is absent.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 215

</div>

### at(size\_t) {#at-2}

<div class="api-signature">

[`Json`](./Json.md) **`at`**(`std::size_t` `index`) `const`

</div>

Object member by key (a read-only copy). Raises [`ClikaRT::Error`](../Error.md) (NotFound) when this is not an object or the key is absent.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 219

</div>

### dump() {#dump}

<div class="api-signature">

`std::string` **`dump`**(`int` `indent` `=` `-1`) `const`

</div>

JSON text. `indent < 0` (the default) is compact (single line); `indent >= 0` pretty-prints with that many spaces per nesting level.

<div class="api-declared">

Declared in `ClikaRT/json/json.h`, line 225

</div>
