是否有 Gson @DeserializedName 等同于 @SerializedName 注释?
Is there a Gson @DeserializedName equivalent to the @SerializedName annotation?
我可以将 @SerializedName
设置为 this_field
,所以当我使用 toJson()
函数时,它会正确使用它。但是,当我尝试通过 fromJson()
函数读取它时,它将尝试使用 thisField
.
通常我会创建一个如下所示的序列化程序;然而,是否有内置的东西可以处理这个问题,或者是为每个 class?
创建自定义反序列化器的唯一方法
一个class
@Data
@Builder
@AllArgsConstructor
public class A {
@SerializedName("this_field")
private Integer thisField;
}
解串器class
public class ADeserializer implements JsonDeserializer<A> {
@Override
public Additional deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject obj = jsonElement.getAsJsonObject();
return A.builder()
.thisField(obj.get("this_field").isJsonNull() ? null : obj.get("this_field").getAsJsonObject)
.build();
}
}
根据 doc
public abstract String[] alternate Returns: the alternative names of
the field when it is deserialized
所以你可以使用
@SerializedName(value="this_field", alternate={"thisField"})
private Integer thisField;
这将导致 this_field
在序列化期间被使用。
在反序列化过程中,如果可用,将使用 this_field
,如果不可用,它将使用 thisField
。
我可以将 @SerializedName
设置为 this_field
,所以当我使用 toJson()
函数时,它会正确使用它。但是,当我尝试通过 fromJson()
函数读取它时,它将尝试使用 thisField
.
通常我会创建一个如下所示的序列化程序;然而,是否有内置的东西可以处理这个问题,或者是为每个 class?
创建自定义反序列化器的唯一方法一个class
@Data
@Builder
@AllArgsConstructor
public class A {
@SerializedName("this_field")
private Integer thisField;
}
解串器class
public class ADeserializer implements JsonDeserializer<A> {
@Override
public Additional deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject obj = jsonElement.getAsJsonObject();
return A.builder()
.thisField(obj.get("this_field").isJsonNull() ? null : obj.get("this_field").getAsJsonObject)
.build();
}
}
根据 doc
public abstract String[] alternate Returns: the alternative names of the field when it is deserialized
所以你可以使用
@SerializedName(value="this_field", alternate={"thisField"})
private Integer thisField;
这将导致 this_field
在序列化期间被使用。
在反序列化过程中,如果可用,将使用 this_field
,如果不可用,它将使用 thisField
。