export const metadata = {
    title: 'JSON',
    description:
        'Guidelines on JSON handling and serialization',
}

# JSON

Identical data structures can be represented in many different ways in JSON. This document describes the rules that must be followed when using JSON in the Versia protocol.

## Encoding

All JSON data **must** be encoded in UTF-8. This is the only encoding supported by the Versia protocol.

Line endings must be in Unix-style `\n` (LF) format. The use of Windows-style `\r\n` (CRLF) line endings is not allowed.

## Keys

Keys in JSON must be strings, cannot be empty, and may only contain the following characters:
- `a-z`
- `A-Z`
- `0-9`
- `-`, `_`, `.`, `#`, `/`, `:`

Duplicate keys are **not** allowed.

``` json {{ "title": "Valid Keys" }}
{
    "valid-key": "value",
    "valid_key": "value",
    "valid.key": "value",
    "valid#key": "value",
    "valid/key": "value",
    "valid:key": "value"
}
```

```json {{ "title": "Invalid Keys" }}
{
    "invalid key": "value", // ❌️ Invalid: space is not allowed
    "invalid@key": "value", // ❌️ Invalid: @ is not allowed
    "": "value", // ❌️ Invalid: empty key is not allowed
    9: "value", // ❌️ How did you even serialize this??
}
```

## Values

### Numbers

Numbers in JSON must be represented as decimal numbers. They can be integers or floating-point numbers, but must follow the following rules:

```json {{ "title": "Must not use scientific notation" }}
{
    "value": 1e3, // ❌️ Invalid
    "value2": 1000 // ✅ Valid
}
```

```json {{ "title": "Must not have leading zeros" }}
{
    "value": 01, // ❌️ Invalid
    "value2": 1 // ✅ Valid
}
```

```json {{ "title": "Must not have trailing decimal points" }}
{
    "value": 1., // ❌️ Invalid
    "value2": 1 // ✅ Valid
}
```

```json {{ "title": "Must not have trailing zeros after the decimal point" }}
{
    "value": 1.00, // ❌️ Invalid
    "value2": 1.0, // ❌️ Invalid
    "value3": 1 // ✅ Valid
}
```

```json {{ "title": "Must not have leading decimal points" }}
{
    "value": .1, // ❌️ Invalid
    "value2": 0.1 // ✅ Valid
}
```

```json {{ "title": "Must not use numbers outside the range -2⁵³ to 2⁵³ (included)." }}
{
    "value": 18014398509481984, // ❌️ Invalid
    "value2": -20873930 // ✅ Valid
}
```

```json {{ "title": "Must not use the negative zero" }}
{
    "value": -0, // ❌️ Invalid
    "value2": 0 // ✅ Valid
}
```

```json {{ "title": "Must not use Infinity or NaN" }}
{
    "value": Infinity, // ❌️ Invalid
    "value2": NaN // ❌️ Invalid
}
```

```json {{ "title": "Must not use hexadecimal or octal notation" }}
{
    "value": 0x1A, // ❌️ Invalid
    "value2": 0o17 // ❌️ Invalid
}
```

### Optional Fields

Fields that are not marked as **required** may be set to `null`, or simply omitted.