#!/usr/bin/env catnip
# Parsing JSON rapide avec orjson
# orjson est 3-10x plus rapide que le json stdlib
# Il travaille nativement avec des bytes (pas de strings)
#
# DEPS: orjson
orjson = import('orjson')
tempfile = import('tempfile')
pathlib = import('pathlib')
shutil = import('shutil')
datetime = import('datetime')
# Parsing depuis bytes (usage natif)
print("⇒ Parsing bytes (natif orjson)")
json_bytes = '{"name": "Alice", "age": 30, "active": true}'.encode('utf-8')
data = orjson.loads(json_bytes)
print(" Nom:", data['name'])
print(" Âge:", data['age'])
# JSON malformé
print()
print("⇒ JSON malformé")
try {
orjson.loads('{"broken": }')
} except {
e: ValueError => { print(" Attrapé:", e) }
}
# Parsing depuis string (converti en bytes automatiquement)
print()
print("⇒ Parsing string")
json_str = '{"status": "ok", "code": 200}'
response = orjson.loads(json_str)
print(" Statut:", response['status'])
# Structures complexes
print()
print("⇒ Structure complexe")
api_json = '{"users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]}'.encode('utf-8')
api_response = orjson.loads(api_json)
for user in api_response['users'] {
print(" -", user['name'], "(id:", user['id'], ")")
}
# Sérialisation -> bytes
print()
print("⇒ Sérialisation (retourne bytes)")
obj = dict(message="Hello", count=42)
serialized = orjson.dumps(obj)
print(" Type:", serialized.__class__.__name__)
print(" Brut:", serialized)
print(" Décodé:", serialized.decode('utf-8'))
# Construction dynamique avec affectation par index
print()
print("⇒ Construction dynamique")
config = dict()
config['host'] = "localhost"
config['port'] = 8080
config['ssl'] = True
result = orjson.dumps(config)
print(" Bytes:", result)
# Dates (orjson gère les dates nativement)
print()
print("⇒ Dates natives")
event = dict(event="meeting", date=datetime.date(2024, 3, 15))
print(" Event:", orjson.dumps(event))
# Écriture/lecture fichier avec bytes
temp_dir = pathlib.Path(tempfile.mkdtemp())
json_file = temp_dir / "data.json"
records = list(
dict(id=1, value=10),
dict(id=2, value=20),
dict(id=3, value=30),
)
print()
print("⇒ Écriture fichier (bytes)")
json_file.write_bytes(orjson.dumps(records))
print(" Fichier:", json_file)
print()
print("⇒ Relecture fichier (bytes)")
reloaded = orjson.loads(json_file.read_bytes())
for r in reloaded {
print(" id:", r['id'], "value:", r['value'])
}
# Nettoyage
shutil.rmtree(str(temp_dir))
print()
print("⇒ Nettoyage effectué")