android - 具有两个具有相同 SerializedName 的字段的类

标签 android gson retrofit2

我的服务有问题,因为同一字段在请求和响应中的形式不同,因此我使用 @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 转换器的 Retrofit。

感谢您的帮助!

最佳答案

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

但是,您可以创建自定义 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);
}

并打印(注意我为 MyObject 使用了自定义 toString()):

{"photo":"myUrl"}
MyObject{url='null', number=12}

关于android - 具有两个具有相同 SerializedName 的字段的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51548584/

相关文章:

android - 我们可以在 android 键盘中同时拥有 Go 和 Next 按钮吗

android - 使用新的 Google Maps API 解码折线

恢复重新加载页面时的android webview

java - 使用 Retrofit 将图像从 Android 上传到 PHP 服务器

android - RXJava。确定 for 循环内的所有 obervables 何时完成

android - Retrofit2 错误处理

Java/android setadapter - 如何取消排序?

java - 使用 GSON 解析 Json 值,可以是 double 值或字符串

java - 如何在android库中包含内部jar文件

包含数组的 JavaScript map 变成包含 map 的 map