Android 使用两个具有相同SerializedName的字段初始化

Android 使用两个具有相同SerializedName的字段初始化,android,gson,retrofit2,Android,Gson,Retrofit2,我的服务有问题,因为同一字段在请求和响应中的形式不同,因此我使用@Expose注释序列化一个字段,反序列化另一个字段: @SerializedName("photo") @Expose(deserialize = false) private String imageB64; @SerializedName("photo") @Expose(serialize = false) private ImageURL imageURL; 但在回应中,我的服务启动了一个例外: Caused by:

我的服务有问题,因为同一字段在请求和响应中的形式不同,因此我使用
@Expose
注释序列化一个字段,反序列化另一个字段:

@SerializedName("photo")
@Expose(deserialize = false)
private String imageB64;

@SerializedName("photo")
@Expose(serialize = false)
private ImageURL imageURL;
但在回应中,我的服务启动了一个例外:

Caused by: java.lang.IllegalArgumentException: class User declares multiple JSON fields named photo
我正在使用GSON转换器进行改装


谢谢你的帮助

我认为不可能添加多个
@SerializedName
注释,否则您将得到您提供的错误

但是,您可以创建一个自定义的
TypeAdapter
,手动手动对对象进行序列化/反序列化,如下所示:

肌体 MyObjectTypeAdapter 它打印(注意,我为
MyObject
使用了一个定制的
toString()
):


谢谢,我通过这个答案找到了一个解决方案,制作了一个TypeAdapterFactory而不是TypeAdapter,并使用它,因为我有几个具有相同结构的对象,解决方案必须是一对一。
public class MyObject {

  private String url;

  private int number;

  // constructor + getters + setters + custom "toString()"
  ...

}
class MyObjectTypeAdapter extends TypeAdapter<MyObject> {

  @Override
  public void write(JsonWriter out, MyObject value) throws IOException {
    out.beginObject().name("photo").value(value.getUrl()).endObject();
  }

  @Override
  public MyObject read(JsonReader in) throws IOException {
    MyObject result = new MyObject();
    in.beginObject();
    while (in.hasNext()) {
      switch (in.nextName()) {
      case "photo":
        result.setNumber(in.nextInt());
      }
      // other fields
      ...
    }

    in.endObject();
    return result;
  }
}
public static void main(String[] args) {
  Gson gson = new GsonBuilder().registerTypeAdapter(MyObject.class, new MyObjectTypeAdapter()).create();

  System.out.println(gson.toJson(new MyObject("myUrl", 1)));

  MyObject deserialized = gson.fromJson("{ \"photo\": 12 }", MyObject.class);

  System.out.println(deserialized);
}
{"photo":"myUrl"}
MyObject{url='null', number=12}