Как игнорировать элемент 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"
}