# Référence rapide JSON

*Syntaxe, types de données, objets, tableaux, jq*

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

## Syntaxe

### Règles

| Command | Description |
|---------|-------------|
| `{ }` | Objet (paires clé-valeur non ordonnées) |
| `[ ]` | Tableau (liste ordonnée de valeurs) |
| `"key": value` | Les clés doivent être des chaînes entre guillemets doubles |
| `No trailing comma` | Le dernier élément ne doit pas avoir de virgule |
| `No comments` | JSON n'autorise pas les commentaires |

### Exemple minimal

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

## Types de données

### Six types de valeurs

| Command | Description |
|---------|-------------|
| `"string"` | Texte UTF-8 entre guillemets doubles |
| `42 / 3.14` | Nombre (entier ou virgule flottante) |
| `true / false` | Booléen |
| `null` | Null (absence de valeur) |
| `{ }` | Objet |
| `[ ]` | Tableau |

### Séquences d'échappement de chaînes

| Command | Description |
|---------|-------------|
| `\"` | Guillemet double |
| `\\` | Barre oblique inverse |
| `\n  \t` | Saut de ligne, tabulation |
| `\uXXXX` | Séquence d'échappement Unicode (hex) |

## Objets

### Syntaxe des objets

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

### Règles

| Command | Description |
|---------|-------------|
| `Keys` | Doivent être des chaînes uniques entre guillemets doubles |
| `Values` | Tout type JSON valide |
| `Order` | L'ordre des clés n'est pas garanti |
| `Nesting` | Les objets peuvent contenir des objets |

## Tableaux

### Syntaxe des tableaux

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

### Tableau de types mixtes

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

### Règles

| Command | Description |
|---------|-------------|
| `Ordered` | Les éléments conservent l'ordre d'insertion |
| `Mixed types` | Les éléments d'un tableau peuvent être de types différents |
| `Indexing` | Base zéro (dans la plupart des langages) |

## Imbrication

### Structure imbriquée

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

### Motifs d'accès

| Command | Description |
|---------|-------------|
| `obj.user.name` | Notation pointée (JavaScript) |
| `obj["user"]["name"]` | Notation entre crochets |
| `obj.user.scores[0]` | Index de tableau dans un objet imbriqué |

## Validation de schéma

### Exemple de schéma JSON

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

### Mots-clés du schéma

| Command | Description |
|---------|-------------|
| `type` | string, number, integer, boolean, object, array, null |
| `required` | Tableau des noms de propriétés obligatoires |
| `properties` | Définit les propriétés attendues de l'objet |
| `enum` | Restreindre à un ensemble fixe de valeurs |
| `minLength / maxLength` | Contraintes de longueur de chaîne |
| `minimum / maximum` | Contraintes de plage numérique |

## Bases de jq

### Filtres courants

| Command | Description |
|---------|-------------|
| `.` | Identité — passer l'entrée telle quelle |
| `.key` | Accéder à une clé d'objet |
| `.key.nested` | Accéder à une clé imbriquée |
| `.[0]` | Premier élément du tableau |
| `.[]` | Itérer tous les éléments du tableau |
| `select(.age > 20)` | Filtrer par condition |
| `map(.name)` | Transformer chaque élément |
| `length` | Longueur du tableau ou de la chaîne |
| `keys` | Clés de l'objet en tableau |

### Exemples 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)'
```

## Modèles courants

### Réponse API

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

### Fichier de configuration

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

### Conseils

| Command | Description |
|---------|-------------|
| `Valider` | Utiliser jsonlint ou python -m json.tool |
| `Affichage formaté` | jq . file.json ou python -m json.tool |
| `JSONL` | Un objet JSON par ligne (délimité par saut de ligne) |
| `JSON5 / JSONC` | Extensions autorisant les commentaires et les virgules finales |
