JSON vers Java

Générer des classes Java POJO depuis du JSON

Essayer un exemple
Nom de la classe racine :

Entrée JSON

Sortie Java

Fonctionne localement · Sûr pour coller des secrets
Les classes Java apparaîtront ici…

Qu'est-ce que la conversion JSON vers classe Java ?

La conversion JSON vers classe Java prend un objet JSON brut et produit des définitions de Plain Old Java Object (POJO) avec des champs privés, des getters et des setters. Java ne possède pas de système de types JSON natif : toute réponse d'API JSON, tout fichier de configuration ou payload de message nécessite une classe correspondante avant de pouvoir être manipulé de façon typée. Des bibliothèques comme Jackson et Gson font correspondre les clés JSON aux champs Java par réflexion, mais elles requièrent que les définitions de classes existent au préalable.

Un POJO Java standard pour la désérialisation JSON déclare un champ privé pour chaque clé JSON, un constructeur sans argument, et une paire getter/setter par champ. Les objets JSON imbriqués deviennent des classes séparées. Les tableaux deviennent des champs List<T> avec un import java.util.List. Les types JSON primitifs correspondent aux primitives Java (int, double, boolean) ou à leurs types enveloppants (Integer, Double, Boolean) lorsqu'ils sont utilisés dans des génériques. Les valeurs nulles correspondent généralement à Object ou à un type référence nullable.

Écrire ces définitions de classes à la main est répétitif. Vous lisez chaque clé JSON, déduisez le type Java depuis la valeur, convertissez les conventions de nommage du camelCase JSON vers les champs Java camelCase, créez des noms de classes PascalCase pour les objets imbriqués, et ajoutez le code répétitif des getters et setters. Pour un objet JSON avec 15 champs et 3 objets imbriqués, cela représente 4 classes, plus de 30 méthodes, et tout doit rester cohérent. Un convertisseur accomplit cela en quelques millisecondes.

Pourquoi utiliser un convertisseur JSON vers Java ?

Créer des POJOs Java manuellement depuis du JSON implique d'inspecter chaque champ, de déduire les types depuis des valeurs d'exemple, d'écrire les paires getter/setter, et de répéter le processus pour chaque objet imbriqué. Quand le contrat d'API change, tout est à mettre à jour à la main. Un convertisseur supprime ce travail mécanique.

Génération instantanée de POJO
Collez votre JSON et obtenez des définitions de classes Java complètes en moins d'une seconde. Les objets imbriqués, les listes et les types primitifs sont détectés et associés automatiquement.
🔒
Traitement respectueux de la confidentialité
La conversion s'exécute entièrement dans votre navigateur via JavaScript. Votre JSON ne quitte jamais votre machine. Les clés d'API, tokens et données de production restent privés.
📝
Inférence de types correcte
Chaque champ généré utilise le type Java approprié déduit de la valeur JSON : String, int, double, boolean, List<T> ou Object pour les valeurs nulles. Les types enveloppants sont utilisés dans les génériques.
📦
Sans installation ni inscription
Ouvrez la page et collez votre JSON. Aucun JDK requis, aucune dépendance Maven, aucun compte à créer. Fonctionne sur tout appareil avec un navigateur.

Cas d'usage du JSON vers Java

Développement d'API Spring Boot
Générez des DTOs de requêtes et réponses depuis des exemples JSON d'API. Collez la forme du payload attendu et obtenez des classes Java prêtes pour les annotations @RequestBody et @ResponseBody dans les contrôleurs Spring.
Développement d'applications Android
Créez des classes de modèles pour les réponses réseau Retrofit ou Volley. Collez le JSON retourné par votre API backend et obtenez des POJOs compatibles avec les convertisseurs Gson ou Moshi.
Intégration de microservices
Définissez des classes de messages typés pour les payloads JSON de Kafka, RabbitMQ ou gRPC. Collez un exemple de message et générez des POJOs qui documentent le contrat attendu entre les services.
Migration de systèmes existants
Convertissez des réponses d'API JSON en classes Java lorsque vous encapsulez des endpoints REST dans un client typé. Utile pour passer des patterns Map<String, Object> peu typés vers des modèles de domaine appropriés.
Assurance qualité et automatisation des tests
Construisez des fixtures de tests typées depuis des exemples de réponses d'API. Les ingénieurs QA peuvent coller de vraies réponses JSON et produire des définitions de POJOs pour les suites de tests JUnit ou TestNG avec des assertions AssertJ.
Apprentissage de la POO Java
Les étudiants peuvent coller n'importe quelle structure JSON et voir comment Java la représente avec des classes, des champs, des getters, des setters et des types imbriqués. Le code généré rend cela concret plutôt qu'abstrait.

Correspondance des types JSON vers Java

Chaque valeur JSON correspond à un type Java spécifique. Le tableau ci-dessous montre comment le convertisseur traduit chaque type JSON en son équivalent Java. La colonne Alternative présente les types enveloppants utilisés dans les contextes génériques comme List<T>, ou les fonctionnalités Java plus récentes comme les Records.

Type JSONExempleType JavaAlternative
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

Référence des annotations JSON Java

Lors de la désérialisation JSON avec Jackson ou Gson, les annotations contrôlent comment les clés JSON correspondent aux champs Java, comment les champs inconnus sont gérés, et comment les valeurs nulles sont traitées. Cette référence couvre les annotations les plus fréquentes lorsqu'on travaille avec des POJOs générés.

AnnotationRôleBibliothèque
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO vs Record vs Lombok

Java propose trois approches courantes pour définir des structures typées afin de contenir des données JSON. Chacune convient à un style de projet et à une version Java différents. Les POJOs sont le pattern traditionnel avec la plus large compatibilité. Les Records réduisent le code répétitif pour les données immuables. Lombok génère les getters, setters et constructeurs à la compilation via des annotations.

POJO
Pattern Java traditionnel. Compatible avec Java 8+. Vous définissez des champs privés ainsi que des méthodes getter/setter. Contrôle total sur la mutabilité et la logique personnalisée. Compatible avec toutes les bibliothèques JSON (Jackson, Gson, Moshi). Le choix standard pour Spring Boot, Android et les bases de code d'entreprise.
Record (Java 16+)
Intégré depuis Java 16 (préversion en 14). Syntaxe compacte : record User(int id, String name) génère le constructeur, les accesseurs, equals, hashCode et toString. Les instances sont immuables. Jackson supporte les Records depuis la version 2.12. Idéal pour les objets valeur et les DTOs où les setters ne sont pas nécessaires.
Lombok @Data
Processeur d'annotations tiers à la compilation. @Data génère les getters, setters, equals, hashCode et toString. @Builder ajoute un pattern builder. Réduit le code répétitif à un niveau proche des Records tout en conservant la mutabilité. Nécessite l'ajout de Lombok à votre outil de build (Maven/Gradle) et un plugin IDE.

Exemples de code

Ces exemples montrent comment utiliser des POJOs Java générés avec Jackson pour la désérialisation, comment produire des classes Java programmatiquement depuis JavaScript et Python, et comment utiliser l'outil CLI jsonschema2pojo pour la génération en lot.

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

Questions fréquentes

Quelle est la différence entre un POJO et un Java Bean ?
Un POJO (Plain Old Java Object) est toute classe Java simple sans dépendance à un framework. Un Java Bean est un POJO qui suit des conventions spécifiques : un constructeur sans argument, des champs privés avec des getters et setters publics, et l'implémentation de Serializable. Pour le mapping JSON, la plupart des bibliothèques requièrent les conventions Bean (getters/setters) mais pas Serializable. Les classes générées par cet outil suivent le pattern getter/setter Bean.
Quelle bibliothèque JSON utiliser avec les POJOs générés ?
Jackson (com.fasterxml.jackson) est la bibliothèque JSON Java la plus utilisée et le choix par défaut dans Spring Boot. Gson (com.google.gson) est populaire dans les projets Android et dispose d'une API plus simple. Moshi est une alternative plus récente de Square, conçue pour l'interopérabilité avec Kotlin. Les trois fonctionnent avec des POJOs standard ayant des getters et des setters.
Comment le convertisseur gère-t-il les objets JSON imbriqués ?
Chaque objet imbriqué devient une classe Java séparée. Si un champ JSON nommé "address" contient un objet avec les clés "street" et "city", le convertisseur crée une classe Address avec ces champs et type le champ parent comme Address. Les structures profondément imbriquées produisent plusieurs définitions de classes.
Que se passe-t-il lorsqu'un champ JSON est null ?
Les champs null sont typés comme Object car le convertisseur ne peut pas déduire le type attendu depuis une valeur null seule. En pratique, vous remplacerez Object par le type attendu (String, Integer, etc.) une fois que vous connaissez le contrat d'API. Avec Jackson, les valeurs null sont assignées aux champs de type référence par défaut, sans erreur.
Faut-il utiliser les Records Java plutôt que des POJOs pour le JSON ?
Les Records conviennent bien aux objets de transfert de données immuables où les setters ne sont pas nécessaires. Jackson supporte les Records depuis la version 2.12, et Gson a ajouté ce support dans des versions ultérieures. Si votre projet tourne sur Java 16+ et que vous traitez les réponses d'API comme des données en lecture seule, les Records réduisent le code répétitif. Si vous avez besoin de mutabilité ou que vous ciblez Java 8/11, restez sur les POJOs.
Comment gérer les clés JSON qui ne sont pas des identifiants Java valides ?
Des clés JSON comme "first-name" ou "2nd_place" ne sont pas des noms de champs Java valides. Utilisez @JsonProperty("first-name") avec Jackson ou @SerializedName("first-name") avec Gson pour faire correspondre la clé JSON à un nom de champ Java valide comme firstName. Le convertisseur convertit automatiquement les noms de clés en champs Java camelCase.
Puis-je générer des classes Java depuis un JSON Schema plutôt que d'un exemple JSON ?
Cet outil génère des classes depuis des exemples de données JSON. Pour une entrée JSON Schema, utilisez le projet jsonschema2pojo (disponible en CLI, plugin Maven et plugin Gradle). Il lit un fichier JSON Schema et produit des classes Java annotées avec des contraintes de validation, des valeurs par défaut et de la documentation issue des descriptions du schéma.