Maison >Java >javaDidacticiel >Comment puis-je désérialiser efficacement des structures JSON personnalisées avec Gson en Java ?

Comment puis-je désérialiser efficacement des structures JSON personnalisées avec Gson en Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-19 20:50:13445parcourir

How Can I Efficiently Deserialize Custom JSON Structures with Gson in Java?

Désérialisation JSON personnalisée avec Gson

En Java, Gson est une bibliothèque populaire pour l'analyse et la sérialisation JSON. Lorsque vous travaillez avec des structures JSON complexes, il peut être nécessaire de définir des désérialiseurs personnalisés pour gérer des formats de données spécifiques.

Considérez l'exemple suivant dans lequel vous avez une classe User et recevez une liste JSON contenant des objets utilisateur.

public class User {
    int id;
    String name;
    Timestamp updateDate;
}
[{"id":1,"name":"Jonas","update_date":"1300962900226"},
{"id":5,"name":"Test","date_date":"1304782298024"}]

Pour définir un désérialiseur personnalisé, implémentez l'interface JsonDeserializer et fournissez une méthode de désérialisation. Cependant, le code fourni dans la question présente plusieurs problèmes :

  • L'utilisation de getAsInt() et getAsJsonPrimitive() n'est pas appropriée car update_date est censée être une chaîne.
  • Désérialiser update_date en utilisant (Timestamp)context.deserialize est incorrect car il suppose que la valeur JSON est déjà un Timestamp object.

Une approche plus appropriée consiste à tirer parti de la prise en charge intégrée de Gson pour les politiques de dénomination de champs et les désérialiseurs personnalisés. Cela réduit le besoin d'analyse manuelle et simplifie le processus de désérialisation :

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
gsonBuilder.registerTypeAdapter(Timestamp.class, new TimestampDeserializer());

Dans le désérialiseur personnalisé, la méthode deserialize analyse la valeur JSON sous forme de chaîne et crée un objet Timestamp :

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);
    }
}

En enregistrant le désérialiseur personnalisé, Gson gérera automatiquement la désérialisation de update_date en tant qu'horodatage en utilisant la logique définie dans TimestampDeserializer.

Cette approche fournit une méthode plus concise et plus sujette aux erreurs pour la désérialisation JSON personnalisée avec Gson.

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