Android Sérialisation / désérialisation JSON avec AutoValue et Gson


Exemple

Importer dans votre fichier racine gradle

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

Importer dans votre fichier d'application Gradle

apt 'com.google.auto.value:auto-value:1.2'  
apt 'com.ryanharter.auto.value:auto-value-gson:0.3.1'  
provided 'com.jakewharton.auto.value:auto-value-annotations:1.2-update1'  
provided 'org.glassfish:javax.annotation:10.0-b28'

Créer un objet avec autovalue:

@AutoValue public abstract class SignIn {    
    @SerializedName("signin_token") public abstract String signinToken();
    public abstract String username();

    public static TypeAdapter<SignIn> typeAdapter(Gson gson) {
        return new AutoValue_SignIn.GsonTypeAdapter(gson);
    }

    public static SignIn create(String signin, String username) {
        return new AutoValue_SignIn(signin, username);
    }
}

Créez votre convertisseur Gson avec votre GsonBuilder

Gson gson = new GsonBuilder()
                .registerTypeAdapterFactory(
                    new AutoValueGsonTypeAdapterFactory())
                .create());

Désérialiser

String myJsonData = "{
    \"signin_token\": \"mySigninToken\",
    \"username\": \"myUsername\" }";
SignIn signInData = gson.fromJson(myJsonData, Signin.class);

Sérialiser

Signin myData = SignIn.create("myTokenData", "myUsername");
String myJsonData = gson.toJson(myData);

L'utilisation de Gson est un excellent moyen de simplifier le code de sérialisation et de désérialisation à l'aide d'objets POJO. L'effet secondaire est que la réflexion est coûteuse en termes de performances. C'est pourquoi l'utilisation d'AutoValue-Gson pour générer CustomTypeAdapter permet d'éviter ce coût de réflexion tout en restant très simple à mettre à jour en cas de changement d'API.