Contactez-nous

Comment générer une chaîne JSON à partir d'un Hash Ruby

Apprenez à convertir vos données Ruby (Hash, Array) en une chaîne JSON. Découvrez `to_json` et `JSON.pretty_generate` pour sauvegarder des configurations ou préparer des données pour une API.

Pourquoi et quand générer du JSON ?

Nous avons appris à lire et interpréter le JSON pour importer des données dans notre programme. L'opération inverse, la génération de JSON, est tout aussi cruciale. Elle consiste à prendre une structure de données Ruby (un Hash ou un Array) et à la convertir en une chaîne de caractères au format JSON.

Vous aurez besoin de cette compétence dans de nombreux scénarios professionnels :

  • Sauvegarder l'état de votre application : Vous pouvez enregistrer les données d'une session ou une configuration utilisateur dans un fichier pour les recharger plus tard.
  • Envoyer des données à une API : Lorsque vous interagissez avec des services web, vous devez souvent envoyer des données (par exemple, pour créer un nouvel utilisateur) en les formatant en JSON dans le corps de votre requête.
  • Echanger des informations entre différents programmes : Le JSON sert de langue véhiculaire pour que des applications écrites dans des langages différents puissent communiquer.

Tout comme pour le parsing, la bibliothèque standard json de Ruby rend cette tâche très simple et intuitive.

La méthode `to_json` : la conversion directe

La manière la plus simple de convertir un objet Ruby en JSON est d'appeler la méthode .to_json sur cet objet. Cette méthode est ajoutée aux classes Hash et Array lorsque vous chargez la bibliothèque json.

Commençons avec un Hash simple. Notez bien ce qui arrive aux clés de type Symbole !

require 'json'

# Un Hash Ruby typique avec des symboles comme clés
user_data = {
  name: 'Alice',
  email: 'alice@example.com',
  is_admin: false
}

# On appelle simplement .to_json sur le Hash
json_string = user_data.to_json

puts json_string
#=> {"name":"Alice","email":"alice@example.com","is_admin":false}

Deux choses importantes sont à observer dans le résultat :

  1. Le Hash Ruby a été transformé en une chaîne de caractères qui est un objet JSON valide.
  2. Les clés, qui étaient des Symboles Ruby (:name), ont été automatiquement converties en chaînes de caractères ("name"), comme l'exige la spécification JSON.

Cette méthode fonctionne de la même manière pour les Tableaux (Arrays) et les structures imbriquées complexes.

Conseil pro : créer un JSON lisible avec `JSON.pretty_generate`

La méthode .to_json est parfaite pour la communication entre machines car elle produit une chaîne compacte, sans espace superflu. Cependant, ce n'est pas idéal si un humain doit lire ou modifier le fichier JSON généré, par exemple pour un fichier de configuration.

Pour cela, la bibliothèque json fournit une méthode alternative : JSON.pretty_generate. Elle prend l'objet Ruby en argument et retourne une chaîne JSON formatée avec une indentation propre.

require 'json'

products = [
  { id: 10, name: 'Laptop', price: 1200 },
  { id: 25, name: 'Mouse', price: 45 }
]

# Génération compacte (illisible pour un humain)
puts products.to_json
#=> [{"id":10,"name":"Laptop","price":1200},{"id":25,"name":"Mouse","price":45}]

puts "---"

# Génération formatée et indentée (lisible)
puts JSON.pretty_generate(products)

La sortie de JSON.pretty_generate sera :

[
  {
    "id": 10,
    "name": "Laptop",
    "price": 1200
  },
  {
    "id": 25,
    "name": "Mouse",
    "price": 45
  }
]

Utilisez pretty_generate chaque fois que la lisibilité du fichier de sortie est une priorité.

Application pratique : sauvegarder une configuration dans un fichier

Mettons maintenant toutes ces pièces ensemble pour accomplir une tâche complète : créer un Hash de configuration en Ruby, le convertir en une chaîne JSON lisible, et l'écrire dans un fichier settings.json.

C'est le processus inverse exact de ce que nous avons fait lorsque nous avons appris à parser un fichier.

require 'json'

# 1. On définit nos données de configuration dans un Hash Ruby
app_settings = {
  version: '1.2.0',
  notifications: {
    enabled: true,
    channel: 'email'
  },
  supported_languages: ['fr', 'en']
}

# 2. On génère une chaîne JSON formatée pour la lisibilité
json_output = JSON.pretty_generate(app_settings)

# 3. On écrit cette chaîne dans un fichier.
# File.write écrase le fichier s'il existe déjà.
File.write('settings.json', json_output)

puts "Le fichier 'settings.json' a été créé avec succès."

Après avoir exécuté ce script, un nouveau fichier settings.json apparaîtra dans votre dossier. Son contenu sera le JSON parfaitement formaté que nous avons généré, prêt à être lu par un autre programme (ou même par celui-ci lors d'un prochain lancement).