Android Ajout d'un convertisseur personnalisé à Gson


Exemple

Parfois, vous devez sérialiser ou désérialiser certains champs dans un format souhaité, par exemple votre backend peut utiliser le format "AAAA-MM-jj HH: mm" pour les dates et vous voulez que votre POJOS utilise la classe DateTime dans Joda Time.

Pour convertir automatiquement ces chaînes en objet DateTimes, vous pouvez utiliser un convertisseur personnalisé.

/**
 * Gson serialiser/deserialiser for converting Joda {@link DateTime} objects.
 */
public class DateTimeConverter implements JsonSerializer<DateTime>, JsonDeserializer<DateTime> {

    private final DateTimeFormatter dateTimeFormatter;

    @Inject
    public DateTimeConverter() {
        this.dateTimeFormatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm");
    }

    @Override
    public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(dateTimeFormatter.print(src));
    }

    @Override
    public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        
        if (json.getAsString() == null || json.getAsString().isEmpty()) {
            return null;
        }

        return dateTimeFormatter.parseDateTime(json.getAsString());
    }
}

Pour que Gson utilise le convertisseur nouvellement créé, vous devez l'assigner lors de la création de l'objet Gson:

    DateTimeConverter dateTimeConverter = new DateTimeConverter();
    Gson gson = new GsonBuilder().registerTypeAdapter(DateTime.class, dateTimeConverter)
            .create();

    String s = gson.toJson(DateTime.now());
    // this will show the date in the desired format

Pour désérialiser la date dans ce format, il suffit de définir un champ au format DateTime:

public class SomePojo {
    private DateTime someDate;    
} 

Lorsque Gson rencontre un champ de type DateTime, il appelle votre convertisseur afin de désérialiser le champ.