
Comment parser un fichier JSON en Hash Ruby
Apprenez à lire et parser un fichier JSON pour le transformer en Hash Ruby utilisable. Ce guide pratique couvre la lecture du fichier, l'utilisation de `JSON.parse` et la gestion des erreurs communes comme `JSON::ParserError`.
Quel est l'objectif du parsing JSON ?
Un fichier JSON n'est, au final, qu'un simple fichier texte. Pour que votre programme Ruby puisse comprendre et utiliser les données qu'il contient, il ne peut pas se contenter de le lire comme une longue chaîne de caractères. Il a besoin de transformer cette chaîne en une structure de données native qu'il sait manipuler, c'est-à-dire un Hash ou un Array.
Ce processus de conversion est appelé "parsing". Heureusement, Ruby est livré avec une bibliothèque standard très puissante nommée json, qui rend cette opération très simple. Vous n'avez même pas besoin d'installer de gem externe pour cette tâche fondamentale.
La méthode au coeur du processus : `JSON.parse`
La pierre angulaire du parsing en Ruby est la méthode JSON.parse. Cette méthode prend un unique argument : une chaîne de caractères contenant des données au format JSON valide. En retour, elle vous donne un objet Ruby (un Hash si le JSON commence par {, un Array s'il commence par [).
Pour utiliser cette méthode, vous devez d'abord charger la bibliothèque json en haut de votre fichier avec require 'json'.
# Il faut d'abord charger la bibliothèque standard json
require 'json'
# Voici une chaîne de caractères contenant du JSON
json_string = '{"ville": "Lyon", "population": 513275}'
# On passe cette chaîne à JSON.parse
ruby_hash = JSON.parse(json_string)
# ruby_hash est maintenant un vrai Hash Ruby !
puts ruby_hash.class #=> Hash
puts "La ville est #{ruby_hash['ville']}" #=> La ville est LyonComprendre cela est essentiel : le parsing ne se fait pas directement sur le fichier, mais sur le contenu textuel du fichier que nous aurons préalablement lu.
Le processus en deux étapes : lire le fichier puis le parser
La manipulation d'un fichier JSON se déroule donc en deux temps, qui sont très logiques :
- Lire le contenu du fichier : On utilise une méthode de lecture de fichier, comme
File.read('chemin/vers/mon_fichier.json'), pour obtenir l'intégralité du contenu du fichier dans une seule variable de type String. - Parser la chaîne obtenue : On passe cette variable à la méthode
JSON.parsepour la convertir en Hash ou en Array.
Voyons cela avec un exemple complet.
Exemple concret : lire un fichier de configuration
Imaginons que nous ayons un fichier de configuration nommé config.json avec le contenu suivant :
{
"database_host": "localhost",
"port": 5432,
"enabled_features": [
"feature_a",
"feature_b"
]
}Notre script Ruby, app.rb, va lire ce fichier pour configurer son comportement.
# app.rb
require 'json'
# Etape 1 : Lire le contenu du fichier dans une chaîne
begin
file_content = File.read('config.json')
rescue Errno::ENOENT
puts "Erreur : Le fichier 'config.json' n'a pas été trouvé."
exit
end
# Etape 2 : Parser la chaîne pour obtenir un Hash
config_hash = JSON.parse(file_content)
# Maintenant, on peut utiliser les données comme avec n'importe quel Hash
puts "Connexion à la base de données sur l'hôte : #{config_hash['database_host']}"
puts "Le port est : #{config_hash['port']}"
puts "Première fonctionnalité activée : #{config_hash['enabled_features'].first}"En exécutant ruby app.rb, le programme lira le fichier, le transformera en Hash et affichera les informations de configuration. Nous avons rendu notre programme dynamique et configurable sans avoir à modifier le code Ruby lui-même.
Erreur commune : le `JSON::ParserError`
La principale erreur que vous rencontrerez est la JSON::ParserError. Elle se produit lorsque la chaîne que vous passez à JSON.parse n'est pas du JSON valide. Les causes les plus fréquentes sont :
- Une virgule manquante ou en trop (souvent à la fin d'une liste).
- Des guillemets simples (
') au lieu de guillemets doubles (") pour les clés ou les chaînes. - Des accolades ou des crochets non fermés.
Si votre fichier config.json avait une virgule en trop après le dernier élément du tableau, votre programme planterait avec un message d'erreur explicite. C'est pourquoi il est crucial de s'assurer que le JSON que vous lisez est bien formé. Des outils en ligne ("JSON validators") peuvent vous y aider.
Conseil pro : convertir les clés en symboles
Par défaut, JSON.parse crée un Hash dont les clés sont des chaînes de caractères ("database_host"). Or, en Ruby, la convention est d'utiliser des symboles (:database_host) comme clés de Hash. C'est plus performant et idiomatique.
La méthode JSON.parse accepte un second argument pour changer ce comportement. En utilisant l'option symbolize_names: true, vous obtiendrez directement un Hash avec des clés symboliques, ce qui est souvent plus pratique.
require 'json'
file_content = File.read('config.json')
# On ajoute l'option pour symboliser les clés
config_hash = JSON.parse(file_content, symbolize_names: true)
# On peut maintenant accéder aux valeurs avec des symboles !
puts "Hôte : #{config_hash[:database_host]}"C'est une bonne pratique à adopter dans la plupart de vos projets pour écrire un code plus propre et plus cohérent avec les conventions de la communauté Ruby.