# JSON Riferimento Rapido

*Sintassi, tipi di dato, oggetti, array, jq*

> Source: JSON Specification (json.org) · MIT

## Sintassi

### Regole

| Command | Description |
|---------|-------------|
| `{ }` | Oggetto (coppie chiave-valore non ordinate) |
| `[ ]` | Array (lista ordinata di valori) |
| `"key": value` | Le chiavi devono essere stringhe con virgolette doppie |
| `No virgola finale` | L'ultimo elemento non deve avere la virgola |
| `Nessun commento` | JSON non ammette commenti |

### Esempio Minimale

```
{
  "name": "Alice",
  "age": 30,
  "active": true
}
```

## Tipi di Dato

### Sei Tipi di Valore

| Command | Description |
|---------|-------------|
| `"string"` | Testo UTF-8 con virgolette doppie |
| `42 / 3.14` | Numero (intero o floating point) |
| `true / false` | Booleano |
| `null` | Null (assenza di valore) |
| `{ }` | Oggetto |
| `[ ]` | Array |

### Sequenze di Escape nelle Stringhe

| Command | Description |
|---------|-------------|
| `\"` | Virgolette doppie |
| `\\` | Backslash |
| `\n  \t` | A capo, tabulazione |
| `\uXXXX` | Escape Unicode (esadecimale) |

## Oggetti

### Sintassi degli Oggetti

```
{
  "id": 1,
  "name": "Widget",
  "tags": ["new", "sale"]
}
```

### Regole

| Command | Description |
|---------|-------------|
| `Chiavi` | Devono essere stringhe univoche con virgolette doppie |
| `Valori` | Qualsiasi tipo JSON valido |
| `Ordine` | L'ordine delle chiavi non è garantito |
| `Annidamento` | Gli oggetti possono contenere altri oggetti |

## Array

### Sintassi degli Array

```
[1, "two", true, null, {"key": "val"}]
```

### Array a Tipi Misti

```
{
  "matrix": [[1, 2], [3, 4]],
  "empty": []
}
```

### Regole

| Command | Description |
|---------|-------------|
| `Ordinato` | Gli elementi mantengono l'ordine di inserzione |
| `Tipi misti` | Gli elementi dell'array possono essere di tipi diversi |
| `Indicizzazione` | Basata su zero (nella maggior parte dei linguaggi) |

## Annidamento

### Struttura Annidata

```
{
  "user": {
    "name": "Alice",
    "address": { "city": "Boston" },
    "scores": [95, 88, 72]
  }
}
```

### Pattern di Accesso

| Command | Description |
|---------|-------------|
| `obj.user.name` | Notazione a punto (JavaScript) |
| `obj["user"]["name"]` | Notazione con parentesi |
| `obj.user.scores[0]` | Indice array dentro un oggetto annidato |

## Validazione dello Schema

### Esempio di Schema JSON

```
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer", "minimum": 0 }
  },
  "required": ["name"]
}
```

### Parole Chiave dello Schema

| Command | Description |
|---------|-------------|
| `type` | string, number, integer, boolean, object, array, null |
| `required` | Array di nomi di proprietà obbligatorie |
| `properties` | Definisce le proprietà attese dell'oggetto |
| `enum` | Limita a un insieme fisso di valori |
| `minLength / maxLength` | Vincoli sulla lunghezza delle stringhe |
| `minimum / maximum` | Vincoli sull'intervallo dei numeri |

## Basi di jq

### Filtri Comuni

| Command | Description |
|---------|-------------|
| `.` | Identità — passa l'input invariato |
| `.key` | Accede a una chiave dell'oggetto |
| `.key.nested` | Accede a una chiave annidata |
| `.[0]` | Primo elemento dell'array |
| `.[]` | Itera tutti gli elementi dell'array |
| `select(.age > 20)` | Filtra per condizione |
| `map(.name)` | Trasforma ogni elemento |
| `length` | Lunghezza dell'array o stringa |
| `keys` | Chiavi dell'oggetto come array |

### Esempi jq

```
echo '{"a":1}' | jq '.a'        # 1
echo '[1,2,3]' | jq 'map(. * 2)' # [2,4,6]
cat data.json | jq '.users[].name'
cat data.json | jq '.[] | select(.active)'
```

## Pattern Comuni

### Risposta API

```
{
  "status": 200,
  "data": [{"id": 1, "name": "Alice"}],
  "meta": {"total": 42, "page": 1}
}
```

### File di Configurazione

```
{
  "host": "localhost",
  "port": 8080,
  "debug": false,
  "features": ["auth", "logging"]
}
```

### Suggerimenti

| Command | Description |
|---------|-------------|
| `Valida` | Usa jsonlint o python -m json.tool |
| `Formatta` | jq . file.json o python -m json.tool |
| `JSONL` | Un oggetto JSON per riga (newline-delimited) |
| `JSON5 / JSONC` | Estensioni che ammettono commenti e virgola finale |
