【发布时间】:2018-02-25 22:24:52
【问题描述】:
我正在使用改造来向我的服务器发出请求。我正在尝试对多个请求使用相同的模型,并且我想发送具有不同 SerializedName 的不同对象。 我的 pojo 看起来像这样:
public class BaseModel<T> implements Serializable {
@SerializedName("success")
@Expose
private boolean succcess;
@SerializedName("data")
@Expose private T data;
public boolean isSucccess() {
return succcess;
}
public void setSucccess(boolean succcess) {
this.succcess = succcess;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
如何以动态方式设置我的@SerializedName("data")?谢谢大家的时间!
代码示例:
public class BaseRequestModel<T> implements Serializable {
@SerializedName("success")
@Expose
private boolean success;
@Expose private T data;
public boolean isSucccess() {
return success;
}
public void setSucccess(boolean succcess) {
this.success = succcess;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
我发送到 BaseModel 的对象之一(作为 T 数据):
public class User implements Serializable {
transient String requestName = "user";
@SerializedName("id")
@Expose
private int id;
@SerializedName("owner_id")
@Expose private int ownerId;
@SerializedName("first_name")
@Expose private String firstName;
@SerializedName("middle_name")
@Expose private String middleName;
@SerializedName("last_name")
@Expose private String lastName;
@SerializedName("username")
@Expose private String username;
public String getRequestName() {
return requestName;
}
public void setRequestName(String requestName) {
this.requestName = requestName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getOwnerId() {
return ownerId;
}
public void setOwnerId(int ownerId) {
this.ownerId = ownerId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
我的自定义序列化器:
public class BaseRequestCustomSerializer<T> implements JsonSerializer<User> {
@Override
public JsonElement serialize(User src, Type typeOfSrc, JsonSerializationContext context) {
src.getRequestName();
return null;
}
}
我必须传递给序列化程序而不是特定对象,因为这就是我的问题所在。有任何想法吗?谢谢!
【问题讨论】:
-
虽然在我看来这听起来有点违反改造试图实现的目标,但您可以尝试编写自定义序列化程序。你甚至可以有一个
transient String name字段,以便能够轻松地检查该字段的名称。 -
@Fred 所以我应该停止使用 SerializedName 而不是初始化一个临时字符串名称?你能更具体地谈谈我的情况吗? (我是 gson 和改造的初学者)
-
嗯,这只是一个想法,但是是的。你会摆脱
@SerializedName,因为它实际上不再有效。您将自定义序列化程序添加到您的 gson - google.github.io/gson/apidocs/com/google/gson/… - 并且由于serialize方法接收对象,您可以轻松地在对象中拥有一个属性,告诉您在序列化过程中使用哪个名称。此属性不应出现在生成的 json 中,因此您将其标记为transient。所有这些都不适用于反序列化......但您只提到了请求部分。 -
@Fred 我已经实现了你的方法,但我仍然有一个问题,我必须将确切的对象传递给 jsonSerializer,我不能使用泛型(
),我将发布一个代码示例更多细节的问题
标签: gson retrofit retrofit2 serializable