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}