Aller au contenu

Échanger et conserver des données

json : sérialisation JSON

Fonction Rôle
dumps(object) Convertir un objet compatible en chaîne JSON.
loads(text) Lire une chaîne JSON.
dump(object, file) Écrire du JSON dans un flux.
load(file) Lire du JSON depuis un flux.
import json

product = {"name": "Écran", "price": 249.90, "available": True}
text = json.dumps(product, ensure_ascii=False, indent=2)
print(text)
restored = json.loads(text)
print(restored["name"])  # Écran

Les types usuels correspondent aux objets, tableaux, chaînes, nombres, booléens et null. Une classe personnalisée, une date ou un Decimal exige une stratégie de conversion. Un texte invalide provoque JSONDecodeError.

Parallèle C# et .NET

var product = new { name = "Écran", price = 249.90, available = true };
string text = JsonSerializer.Serialize(product, new JsonSerializerOptions
{
    WriteIndented = true
});
Console.WriteLine(text);
using JsonDocument document = JsonDocument.Parse(text);
Console.WriteLine(document.RootElement.GetProperty("name").GetString()); // Écran

System.Text.Json est fourni avec .NET moderne. Serialize() et Deserialize<T>() correspondent à la sérialisation et à la lecture typée. JsonDocument permet de lire sans modèle métier. Les échappements, la représentation numérique et les conventions de nommage peuvent différer de Python. Le sérialiseur .NET gère notamment DateTime et decimal, contrairement au sérialiseur Python par défaut.

csv : données tabulaires

Élément Rôle
reader() / writer() Lire / écrire des lignes de valeurs.
DictReader() / DictWriter() Lire / écrire avec des noms de colonnes.
delimiter Choisir le séparateur, par exemple ;.
writerow() / writerows() Écrire une ligne / plusieurs lignes.
import csv
from io import StringIO

content = "name;price\nClavier;69.90\nSouris;24.90\n"
reader = csv.DictReader(StringIO(content), delimiter=";")

for row in reader:
    print(row["name"], float(row["price"]))

Les valeurs lues sont des chaînes ; les conversions restent à effectuer. Pour les fichiers, utilisons open(..., newline="", encoding="utf-8") afin de laisser le module gérer les fins de ligne.

Parallèle C# et .NET

string content = "name;price\nClavier;69.90\nSouris;24.90\n";
using var reader = new StringReader(content);
using var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader);
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
parser.SetDelimiters(";");
parser.HasFieldsEnclosedInQuotes = true;
string[] headers = parser.ReadFields()!;
while (!parser.EndOfData)
{
    string[] fields = parser.ReadFields()!;
    double price = double.Parse(fields[1], CultureInfo.InvariantCulture);
    Console.WriteLine($"{fields[0]} {price}");
}

TextFieldParser, utilisable depuis C# et fourni dans la bibliothèque .NET, lit des champs délimités avec prise en charge des guillemets. Il n’offre pas exactement le contrat de csv.DictReader ni un écrivain symétrique. Pour une API CSV complète et des modèles typés, CsvHelper est une option tierce via NuGet. Un simple Split() ne traite pas correctement tous les CSV.

tomllib : configuration TOML

Depuis Python 3.11, tomllib lit le format TOML, utilisé notamment par pyproject.toml.

import tomllib

configuration = tomllib.loads('''
[application]
name = "Demo"
retries = 3
''')
print(configuration["application"]["retries"])  # 3

loads() reçoit une chaîne. load() reçoit un fichier ouvert en mode binaire, par exemple avec open("config.toml", "rb"). Le module standard ne fournit pas d'écriture TOML.

Parallèle C# et .NET

// Alternative de format : lecture JSON, et non lecture TOML.
string json = "{\"application\":{\"name\":\"Demo\",\"retries\":3}}";
using JsonDocument document = JsonDocument.Parse(json);
int retries = document.RootElement.GetProperty("application")
    .GetProperty("retries").GetInt32();
Console.WriteLine(retries); // 3

La bibliothèque de base .NET 8 ne fournit pas de lecteur TOML directement comparable. Pour conserver TOML, ajoutons une bibliothèque NuGet spécialisée. Le code ci-dessus répond au besoin de configuration structurée avec JSON et ne lit pas le contenu TOML de l’exemple Python.

sqlite3 : base relationnelle embarquée

sqlite3 permet de travailler avec SQLite sans serveur de base de données séparé.

Élément Rôle
connect(path) Ouvrir une base ; ":memory:" pour une base en mémoire.
execute() / executemany() Exécuter une requête / une série de requêtes.
fetchone() / fetchall() Lire une ligne / toutes les lignes restantes.
commit() / rollback() Valider / annuler une transaction.
close() Fermer la connexion.
import sqlite3

connection = sqlite3.connect(":memory:")
try:
    with connection:
        connection.execute("CREATE TABLE products (name TEXT, price REAL)")
        connection.execute(
            "INSERT INTO products VALUES (?, ?)", ("Clavier", 69.90)
        )
    rows = connection.execute("SELECT name FROM products").fetchall()
    print(rows)  # [('Clavier',)]
finally:
    connection.close()

Transmettons les valeurs comme paramètres. Le gestionnaire with connection gère les transactions mais ne ferme pas la connexion.

Parallèle C# et .NET

// Package NuGet requis : Microsoft.Data.Sqlite
using var connection = new Microsoft.Data.Sqlite.SqliteConnection("Data Source=:memory:");
connection.Open();
using (var command = connection.CreateCommand())
{
    command.CommandText = "CREATE TABLE products (name TEXT, price REAL)";
    command.ExecuteNonQuery();
}
using (var transaction = connection.BeginTransaction())
{
    using var command = connection.CreateCommand();
    command.Transaction = transaction;
    command.CommandText = "INSERT INTO products VALUES ($name, $price)";
    command.Parameters.AddWithValue("$name", "Clavier");
    command.Parameters.AddWithValue("$price", 69.90);
    command.ExecuteNonQuery();
    transaction.Commit();
}
using var query = connection.CreateCommand();
query.CommandText = "SELECT name FROM products";
using var rows = query.ExecuteReader();
while (rows.Read()) Console.WriteLine(rows.GetString(0));

Microsoft.Data.Sqlite est un fournisseur Microsoft distribué séparément via NuGet ; il n’est pas inclus dans la bibliothèque de base .NET. Les objets ADO.NET séparent connexion, commande, transaction et lecteur. Les paramètres évitent la concaténation des valeurs SQL. La base en mémoire subsiste tant que la connexion correspondante reste ouverte.