Skip to content
jsonforge.app
Retour au blog
Tutoriel15 min de lecture

Exemples JSON en 7 langages : JavaScript, Python, Go, Rust, PHP, Java, C#

JSON est universel, mais chaque langage le gère différemment. Voici une référence côte à côte pour analyser, sérialiser et gérer les erreurs dans sept langages populaires.

JavaScript

JavaScript est le terrain natif de JSON. Analysez avec JSON.parse, sérialisez avec JSON.stringify, et enveloppez toujours l'analyse dans un try/catch.

typescript
// Parse a JSON string into an object (always guard with try/catch)
let data;
try {
  data = JSON.parse('{"name": "Alice", "age": 30}');
  console.log(data.name); // "Alice"
} catch (err) {
  console.error("Invalid JSON:", err.message);
}

// Serialize an object back to JSON
const json = JSON.stringify(data, null, 2);

// Fetch JSON from an API (res.json() rejects on invalid JSON)
const res = await fetch("/api/users/1");
const user = await res.json(); // parsed automatically

Python

Le module json intégré à Python associe les objets JSON à des dicts et les tableaux à des lists. Utilisez json.loads (chaîne → objet) et json.dumps (objet → chaîne).

python
import json

# Parse JSON string into a dict
data = json.loads('{"name": "Alice", "age": 30}')

# Serialize a dict to a pretty JSON string
text = json.dumps(data, indent=2, ensure_ascii=False)

# Read/write a JSON file
with open("data.json", encoding="utf-8") as f:
    data = json.load(f)

Go

Le package encoding/json de Go associe le JSON à des structs via des tags. Utilisez json.Marshal pour sérialiser et json.Unmarshal pour analyser, les tags de struct contrôlant les noms de champs.

go
type User struct {
    Name string   `json:"name"`
    Age  int      `json:"age"`
}

// Struct → JSON
b, _ := json.Marshal(User{Name: "Alice", Age: 30})

// JSON → struct
var u User
_ = json.Unmarshal([]byte(`{"name":"Bob","age":25}`), &u)

Rust

Rust utilise les crates serde et serde_json pour une (dé)sérialisation à coût nul et type-safe. Dérivez Serialize/Deserialize sur un struct et serde_json s'occupe du reste — y compris des messages d'erreur précis avec ligne et colonne en cas d'échec d'analyse.

rust
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct User {
    name: String,
    age: u8,
}

fn main() -> Result<(), serde_json::Error> {
    // JSON → struct
    let u: User = serde_json::from_str(r#"{"name":"Alice","age":30}"#)?;

    // Struct → JSON (pretty-printed)
    let json = serde_json::to_string_pretty(&u)?;
    println!("{}", json);
    Ok(())
}

PHP

PHP dispose nativement de json_encode/json_decode, sans aucune dépendance. Passez true en deuxième argument à json_decode pour obtenir des tableaux associatifs au lieu d'objets stdClass, et vérifiez toujours json_last_error() — json_decode renvoie null en cas d'échec, qui est aussi une valeur JSON valide.

php
<?php
// PHP array → JSON
$json = json_encode(["name" => "Alice", "age" => 30],
    JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

// JSON → PHP array
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON error: " . json_last_error_msg();
}

Java

Java utilise généralement l'ObjectMapper de Jackson. Les records (Java 16+) font des DTO propres sans boilerplate — Jackson s'y lie directement, y compris la gestion des propriétés inconnues via configure.

java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.DeserializationFeature;

record User(String name, int age) {}

ObjectMapper mapper = new ObjectMapper()
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

// JSON → record
User user = mapper.readValue("{\"name\":\"Alice\",\"age\":30}", User.class);

// Record → JSON
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);

C#

Le C# moderne utilise System.Text.Json (intégré à .NET). Des attributs comme JsonPropertyName associent les conventions de nommage JSON aux propriétés PascalCase, et JsonSerializerOptions contrôle la casse en sortie.

csharp
using System.Text.Json;
using System.Text.Json.Serialization;

public class User
{
    [JsonPropertyName("name")]
    public string Name { get; set; } = "";

    [JsonPropertyName("age")]
    public int Age { get; set; }
}

// JSON → object
var user = JsonSerializer.Deserialize<User>(
    "{\"name\":\"Alice\",\"age\":30}")!;

// Object → JSON (camelCase to match JSON conventions)
var options = new JsonSerializerOptions {
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
string json = JsonSerializer.Serialize(user, options);

Bonnes pratiques universelles

Gérez toujours les erreurs d'analyse — un JSON mal formé fera planter du code non protégé. Pour les API en production, validez par rapport à un JSON Schema avant le traitement. Préférez les structs/classes typés aux maps génériques dans les langages compilés. Affichez en mode lisible pendant le développement, minifiez en production.

FAQ

Quel langage a l'analyseur JSON le plus rapide ?
Les langages compilés (Go, Rust, Java avec Jackson, C# avec System.Text.Json) surpassent généralement les langages interprétés. Pour la plupart des applications, la différence est négligeable face aux coûts réseau et de base de données.
Faut-il utiliser un struct typé ou une map générique ?
Les structs/classes typés détectent les incompatibilités de schéma à la compilation et offrent l'autocomplétion. N'utilisez les maps génériques que lorsque la forme est véritablement dynamique ou inconnue.

Articles associés