Maison >Java >javaDidacticiel >Comment désérialiser efficacement les horodatages JSON personnalisés avec Gson ?

Comment désérialiser efficacement les horodatages JSON personnalisés avec Gson ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 16:57:18508parcourir

How to Efficiently Deserialize Custom JSON Timestamps with Gson?

Désérialisation JSON personnalisée avec Gson : un guide complet

Dans le domaine de Java, Gson s'impose comme une formidable bibliothèque de gestion des données JSON . Ses fonctionnalités complètes incluent la possibilité de créer des désérialiseurs personnalisés qui permettent une conversion personnalisée des éléments JSON en objets Java. Examinons un scénario spécifique pour illustrer comment cela peut être réalisé.

L'énoncé du problème

Imaginez une classe Java nommée Utilisateur avec des champs pour l'identifiant, le nom et l'horodatage. -date de mise à jour basée. Les données JSON reçues d'un service Web fournissent une liste de ces objets utilisateur. Le défi réside dans l'écriture d'un désérialiseur personnalisé pour transformer ce JSON en instances de la classe User.

Tentative de solution

Une première tentative de désérialiseur pourrait ressembler à ce qui suit :

@Override
public User deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
    return new User(
            json.getAsJsonPrimitive().getAsInt(),
            json.getAsString(),
            json.getAsInt(),
            (Timestamp)context.deserialize(json.getAsJsonPrimitive(), Timestamp.class));
}

Cependant, cette approche présente des défis en raison de ses aspects d'analyse manuelle, qui compromettent quelque peu les avantages automatisés de Gson.

Solution alternative

Une approche plus raffinée consiste à minimiser l'analyse manuelle et à exploiter pleinement les capacités de Gson. Considérez l'implémentation suivante :

// User class remains unchanged

// TimestampDeserializer class
class TimestampDeserializer implements JsonDeserializer<Timestamp> {
    @Override
    public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        long time = Long.parseLong(json.getAsString());
        return new Timestamp(time);
    }
}

class Foo {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .registerTypeAdapter(Timestamp.class, new TimestampDeserializer())
                .create();

        // Construct sample JSON data with corrected "update_date" field
        String jsonInput = "...";

        User[] users = gson.fromJson(jsonInput, User[].class);
        for (User user : users) {
            System.out.println(user);
        }
    }
}

Explication

Cette approche raffinée utilise un désérialiseur personnalisé (TimestampDeserializer) spécialement conçu pour gérer les conversions d'horodatage. La classe TimestampDeserializer adhère à l'interface JsonDeserializer, remplaçant la méthode deserialize pour extraire l'horodatage en millisecondes de l'élément JSON et le convertir en un objet Timestamp.

En tirant parti du modèle de générateur de Gson, des personnalisations supplémentaires sont appliquées de manière transparente. FieldNamingPolicy est défini sur camelCase, mappant les clés JSON aux noms de champs Java. De plus, TimestampDeserializer est enregistré comme adaptateur de type pour les horodatages.

Le code résultant présente une puissante combinaison de capacités de Gson, gérant efficacement la conversion des données JSON en objets Java tout en minimisant les frais d'analyse manuelle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn