<!--
  canonical-url: https://www.avonture.be/fr/blog/json-faker
  published:     2024-11-19
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# JSON - Faker & Mockup

> Générez et validez des données JSON avec la librairie Faker de Python et Mockaroo. Apprenez à créer de fausses données pour vos tests et à garantir la qualité des fichiers reçus avec des schémas.

---
![JSON - Faker & Mockup](/img/v2/json.webp)

**TL;DR**

Cet article traite de la génération et de la validation de fausses données JSON pour vos tests : utiliser la librairie `Faker` de Python pour scripter des faux enregistrements sur mesure, utiliser Mockaroo.com (constructeur de schéma + API gratuite) pour générer de gros jeux de données comme 1 000 rows ou plus, et utiliser un convertisseur JSON-vers-schéma en ligne avec la librairie `jsonschema` de Python pour valider que les fichiers reçus correspondent bien à la structure attendue.

J'ai récemment travaillé sur un projet ETL en Python. Entre autres choses, le script devait traiter des fichiers JSON que les utilisateurs déposaient dans un dossier précis.

Comme il s'agissait d'une application sensible, il était important de valider le script en soumettant de faux fichiers JSON, mais aussi de garantir la qualité des fichiers reçus.

*Deux compagnons quand vous travaillez avec du JSON en ligne de commande : [The jq utility for Linux](/blog/linux-jq) pour inspecter et filtrer un fichier généré, et [Rendering a JSON file as a mind map](/blog/json-crack) pour saisir d'un coup d'œil la structure d'un fichier inconnu.*

Pour les faux fichiers, j'ai utilisé un outil comme la librairie Faker pour Python.

## Générer un faux fichier JSON {#generate-faker-json-file}

L'idée est donc de générer un dictionnaire (un fichier json) avec de fausses données. Avec la librairie `Faker`, c'est vraiment, vraiment simple.

Installez d'abord la librairie avec `pip install faker`.

Voici un petit script Python pour générer de fausses données en français (remplacez simplement `range(1)` par `range(100)`, par exemple, pour obtenir 100 enregistrements) :

**fake.py**

```python
fake = Faker()

fake = Faker('fr_FR')

data = []

for _ in range(1):
    user = {
        'firstname': fake.first_name(),
        'lastname': fake.last_name(),
        'address': fake.street_address(),
        'city': fake.city(),
        'country': fake.country(),
        'gender': fake.random_element(elements=('Homme', 'Femme', 'Non binaire'))
    }

    data.append(user)

# Pretty print the JSON data
print(json.dumps(data, indent=4, ensure_ascii=False))
```

![Faker in Python](./images/python.webp)

> **Information:**
>
> Poursuivez votre lecture avec la documentation officielle de Faker : <https://faker.readthedocs.io/en/master/>

## Utiliser Mockaroo.com {#using-mockaroocom}

Le site <https://www.mockaroo.com/> permet de créer de fausses données gratuitement (pour accéder à certaines fonctions, vous devrez créer un compte gratuit).

![Using Mockaroo](./images/mockaroo.webp)

### Créer de fausses données à partir d'un schéma {#creating-a-fake-data-using-a-schema}

Après avoir créé un compte gratuit sur Mockaroo, cliquez sur le bouton `Schemas`, puis sélectionnez `Create a schema`. Sur l'écran suivant, cliquez sur `Generate fields using AI...` et collez une chaîne JSON existante :

![Creating a schema](./images/creating_schema.webp)

Cela fait, vous pourrez générer un grand nombre de rows — par exemple, un fichier avec plus de 1 000 enregistrements.

En sauvegardant les exemples dans un vrai fichier JSON sur le disque, vous pouvez ensuite utiliser ce fichier pour tester votre application.

### Utiliser l'API {#using-api}

En créant un compte gratuit sur Mockaroo, vous pouvez obtenir une clé d'API gratuite (limitée à 200 requêtes/jour).

La documentation de l'API est ici : <https://mockaroo.com/docs>.

Comme précédemment, cliquez sur le bouton `Schemas`, créez un schéma et sauvegardez-le.

J'ai créé le *schema\_test* comme ceci :

![Mockaroo - Schema test](./images/mockaroo_schema_test.webp)

Je peux ensuite l'utiliser en Python comme ceci :

**schema\_test.py**

```python
# My API key as displayed in my profile page on Mockaroo
api_key = "MY_API_KEY"

# This is the name of my schema
schema = "schema_test"

# Number of records I want
num_records = 10

# Construct the API endpoint URL
url = f"https://api.mockaroo.com/api/generate?key={api_key}&count={num_records}&schema={schema}"

# Make the API request
response = requests.get(url)

# Check if the request was successful
if response.status_code == 200:
    # Parse the JSON response
    data = response.json()

    # Display the result on the console
    print(data)
else:
    print(f"Error fetching data: {response.text}")
```

> **Information:**
>
> Pour que ce code fonctionne, pensez à installer la librairie requests : `pip install requests`.

En appelant mon script deux fois, j'ai obtenu chaque fois un jeu de données différent :

![Calling Mockaroo API](./images/calling_mockaroo_api.webp)

## Convertisseur JSON vers schéma en ligne {#online-json-to-schema-converter}

Le site <https://www.liquid-technologies.com/online-json-to-schema-converter> vous permet de copier/coller du JSON existant et d'obtenir un squelette de schéma JSON.

![Generate a schema](./images/generate_schema.webp)

Une fois le schéma en main, vous pouvez l'utiliser en Python comme ceci :

**validate.py**

```python
def validate_json(data_file, schema_file):
  with open(schema_file) as f:
    schema = json.load(f)

  with open(data_file) as f:
    data = json.load(f)

  jsonschema.validate(instance=data, schema=schema)

data_file = "data.json"
schema_file = "schema.json"

try:
    validate_json(data_file, schema_file)
    print("Data is valid!")
except jsonschema.exceptions.ValidationError as exception:
    print(f"Data is invalid: {exception}")
```

> **Information:**
>
> Vous devrez d'abord lancer `pip install jsonschema`.

Maintenant, je vais tester mon fichier. La première fois, mon fichier JSON sera correct. J'ai ensuite supprimé l'enregistrement `city` de mon JSON, et relancer le script échoue bien, comme prévu :

![JSON validation](./images/validate.webp)

> **Information:**
>
> Comme on le voit, très vite, nous avons généré 1 000 enregistrements et, aussi, un schéma de validation. Puis, en quelques lignes de Python, nous nous sommes assurés que le fichier est correct ou, sinon, nous avons repéré où se trouve l'erreur.

D'autres outils JSON à connaître : [afficher un fichier JSON sous forme de carte mentale](/blog/json-crack) et [linter/valider vos fichiers JSON](/blog/json-lint).
