Как игнорировать элемент JSON в Android Retrofit

Я разрабатываю приложение для Android, которое отправляет JSON с помощью Android Retrofit (он преобразует класс POJO в JSON). Он работает нормально, но мне нужно игнорировать при отправке JSON один элемент из класса POJO.

Кто-нибудь знает аннотацию Android Retrofit?

Пример

Класс 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;
   }


}

Отправитель интерфейса ApiClass

 public interface SvcApi {

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

}

Любая идея, как игнорировать text2?

Ответ 1

Я нашел альтернативное решение, если вы не хотите использовать new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().

Просто включив transient в переменную, которую мне нужно игнорировать.

Итак, класс POJO наконец:

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

Я надеюсь, что это поможет

Ответ 2

Отметьте нужные поля с помощью @Выставить аннотацию, например:

@Expose private String id;

Оставьте все поля, которые вы не хотите сериализовать. Затем просто создайте объект Gson таким образом:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

Ответ 3

Вы можете настроить Retrofit, добавив объект GSON из GSONBuilder в ваш ConverterFactory, см. мой пример ниже:

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

Чтобы игнорировать элементы поля, просто добавьте @Expose (deserialize = false, serialize = false) к вашим свойствам или none, а для (de) сериализуйте ваши элементы полей, вы можете добавить аннотации @Expose() с пустыми значениями к вашему свойства.

@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.

Ответ 4

Если вы используете Kotlin + Retrofit + Moshi (я проверял это) В случае, если вы хотите условно игнорировать поля, вы можете установить его на ноль.

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

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

Сгенерированный Json будет

user{
"id": "some id"
}