web-dev-qa-db-fra.com

Comment ignorer un élément JSON dans Android Retrofit

Je développe une Android App qui envoie un JSON en utilisant Android Retrofit (il convertit une classe POJO en JSON). Cela fonctionne bien, mais je besoin d'ignorer dans l'envoi de JSON un élément de la classe POJO.

Quelqu'un connaît-il une Android annotation de mise à niveau?

Exemple

Classe POJO:

public class sendingPojo
{
   long id;
   String text1;
   String text2;//--> I want to ignore that in the JSON

   getId(){return id;}
   setId(long id){
     this.id = id;
   }

   getText1(){return text1;}
   setText1(String text1){
     this.text1 = text1;
   }

   getText2(){return text2;}
   setText2(String text2){
     this.text2 = text2;
   }


}

Interface Sender ApiClass

 public interface SvcApi {

 @POST(SENDINGPOJO_SVC_PATH)
 public sendingPojo addsendingPojo(@Body sendingPojo sp);

}

Une idée comment ignorer text2?

19
Alberto Crespo

J'ai trouvé une solution alternative si vous ne voulez pas utiliser new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().

Il suffit d'inclure transient dans la variable que je dois ignorer.

Donc, la classe POJO enfin:

public class sendingPojo {
    long id;
    String text1;
    transient String text2;//--> I want to ignore that in the JSON

    getId() {
        return id;
    }

    setId(long id) {
        this.id = id;
    }

    getText1() {
        return text1;
    }

    setText1(String text1) {
        this.text1 = text1;
    }

    getText2() {
        return text2;
    }

    setText2(String text2) {
        this.text2 = text2;
    }
}

J'espère que ça aide

15
Alberto Crespo

Marquez les champs souhaités avec l'annotation @Expose, tels que:

@Expose private String id;

Omettez tous les champs que vous ne souhaitez pas sérialiser. Ensuite, créez simplement votre objet Gson de cette façon:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
14
nikhil.thakkar

Vous pouvez configurer Retrofit en ajoutant l'objet GSON de GSONBuilder dans votre ConverterFactory, voir mon exemple ci-dessous:

private static UsuarioService getUsuarioService(String url) {
    return new Retrofit.Builder().client(getClient()).baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create(getGson())).build()
            .create(UsuarioService.class);
}

private static OkHttpClient getClient() {
    return new OkHttpClient.Builder().connectTimeout(5, MINUTES).readTimeout(5, MINUTES)
            .build();
}

private static Gson getGson() {
    return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
}

Pour ignorer les éléments de champ, ajoutez simplement @Expose (deserialize = false, serialize = false) à vos propriétés ou aucune, et pour (dé) sérialiser vos éléments de champs, vous pouvez ajouter les annotations @Expose () avec des valeurs vides à vos propriétés.

@Entity(indexes = {
        @Index(value = "id DESC", unique = true)
})
public class Usuario {

    @Id(autoincrement = true)
    @Expose(deserialize = false, serialize = false) 
    private Long pkey; // <- Ignored in JSON
    private Long id; // <- Ignored in JSON, no @Expose annotation
    @Index(unique = true)
    @Expose
    private String guid; // <- Only this field will be shown in JSON.
6

Si vous utilisez Kotlin + Retrofit + Moshi (j'ai testé cela) Dans le cas où vous souhaitez ignorer conditionnellement les champs, vous pouvez le définir sur null.

data class  User(var id: String,  var name: string?)

val user = User()
user.id = "some id"
user.name = null

Le Json généré serait

user{
"id": "some id"
}
2
Bellan