【问题标题】:Gson set SerializedNameGson 设置 SerializedName
【发布时间】: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


【解决方案1】:

如果您想设置 @SerializedName("data") ,则必须从 api 响应中获取相同的变量名。

【讨论】:

  • 如果变量名是动态的,那我们该怎么办。喜欢而不是“数据”它的数字像 2, 3, 8 等。
猜你喜欢
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多