如何忽略用于改造的模型中的一些变量

时间:2017-08-29 05:21:50

标签: android retrofit2 gson

我正在使用 Retrofit 向我的服务器发送和接收请求。

我有一个类似下面的模型,我必须将它发送到我的服务器,但是这个模型中的一些变量不能发送到服务器。

public class SelectedListModel implements Serializable {

  @SerializedName("p_id")
  @Expose
  private Long pId;

  @SerializedName("p_qty")
  @Expose
  private Double pQty;

  @Expose(serialize = false , deserialize = false)
  private String pName; //Have not to send to server

  @Expose(serialize = false , deserialize = false)
  private String pPrice; //Have not to send to server

  @Expose(serialize = false , deserialize = false)
  private String pImageUrl; //Have not to send to server
}

因此,我的服务器响应中得到400。 我使用@Expose(serialize = false, deserialize = false)来忽略那些没有发送到服务器的变量。 但它不起作用。 有没有办法做到这一点,或者我必须为我的服务器创建另一个模型?

3 个答案:

答案 0 :(得分:6)

使用transient关键字

public class SelectedListModel implements Serializable {

  @SerializedName("p_id")
  @Expose
  private Long pId;

  @SerializedName("p_qty")
  @Expose
  private Double pQty;

  //@Expose(serialize = false , deserialize = false)
  private transient String pName; //Have not to send to server

  //@Expose(serialize = false , deserialize = false)
  private transient String pPrice; //Have not to send to server

  //@Expose(serialize = false , deserialize = false)
  private transient String pImageUrl; //Have not to send to server
}

并且无需使用@Expose(serialize = false , deserialize = false)到需要排除的字段中。

阅读Why does Java have transient fields?Why use the `transient` keyword in java?了解详情。

答案 1 :(得分:2)

在请求api调用时,您可以使用transient关键字忽略字段

JAVA:

transient String name;

科特琳:

@Transient
var name: String

答案 2 :(得分:0)

像这样更改您的Retrofit适配器代码(我希望您使用retrofit2)

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

Retrofit retrofit = new Retrofit.Builder()  
     .baseUrl(BASE_URL)
     .addConverterFactory(GsonConverterFactory.create(gson))
     .build();