我正在写和Android添加并使用retrofit2将数据发送到服务器。
我正在尝试从正在序列化的对象中排除一个字段并将其发送到服务器。
该对象被命名为“Cheer”,我尝试在发送到服务器时从中排除字段ID。 iv'e尝试使用@Expose(false,false)并解释here并尝试将该字段设为私有,但它仍然发送到服务器。请参阅下面的api,对象和调用。请注意,它工作,对象被添加到服务器,唯一的问题是,ID仍然在JSON中发送,我需要将其从中排除。
谢谢!
public class Cheer {
@Expose(deserialize = false, serialize = false)
private int id;
}
public interface CheersAPI {
String BASE_URL = "url:port";
@POST("/cheers")
Call<Cheer> AddCheer(@Body Cheer cheer);
}
cheersAPI.AddCheer(cheerToAdd).enqueue(new Callback<Cheer>(){
@Override
public void onResponse(Call<Cheer> call, Response<Cheer> response) {
Log.d("in the on response", "done creating a cheer");
}
@Override
public void onFailure(Call<Cheer> call, Throwable t) {
Log.d("failed", "failed to add a cheer here!");
}
});
答案 0 :(得分:3)
我假设你正在使用Gson。您可以使用transient
。
private transient int id;
如果您需要更复杂的解决方案,请查看Gson: How to exclude specific fields from Serialization without annotations
答案 1 :(得分:1)
访问here了解详情。
基本上, 默认的Gson实例不会将@Expose视为默认值。为了利用它,您需要使用自定义Gson实例:
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
但如果你这样做,你必须将@Expose添加到所有模型类中的每个字段,否则它们不会被GSON序列化或反序列化。
答案 2 :(得分:1)
这是使用翻新的方法
val gson: Gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
builder = Retrofit.Builder()
.client(okHttpClient)
.baseUrl(URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
在您的模型中
// These values are read as JSON objects only in server response
@SerializedName("someField")
@Expose(serialize = false, deserialize = true)
var someField: String? = null
例如,在这里,我们不会将JSON对象发送到服务器(deserialize = false),但是将其作为响应接收(deserialize = true)
答案 3 :(得分:0)
只需使用注释@Transient
,即可从请求中排除POJO中的任何变量
示例
data class Group(val group_id: String,
val group_name: String,
@Transient val isChecked:Boolean = false)
/**
* Marks the JVM backing field of the annotated property as `transient`, meaning that it is not
* part of the default serialized form of the object.
*/