Java Gson-如何进行特殊处理,如掩蔽

Java Gson-如何进行特殊处理,如掩蔽,java,gson,Java,Gson,如何配置Gson对toJson的值进行额外处理 public class MyClass{ @SerializedName("qwerty") @Mask(exposeFront=2, exposeRear=2, mask="*") private String qwerty } 假设MyClass#qwerty的值为1234567890,如何将Gson设置为输出{“qwerty”:“12*******90”}?GsonRefle

如何配置Gson对toJson的值进行额外处理

public class MyClass{
    @SerializedName("qwerty")
    @Mask(exposeFront=2, exposeRear=2, mask="*")
    private String qwerty
}

假设
MyClass#qwerty
的值为
1234567890
,如何将Gson设置为输出
{“qwerty”:“12*******90”}

Gson
ReflectTypeAdapterFactory
,该工厂负责“普通”对象的序列化和反序列化,无法增强以支持任何其他批注,如
@Masked
。它只能使用注释,如
@Expose
(通过排除策略间接)、
@SerializedName
,以及其他一些注释,如
@Since
@Until
(也是排除策略)。注意:这些注释是文档化的,默认情况下受支持。一般来说,Gson建议为声明类使用类型适配器,
MyClass
,但这也意味着您必须管理所有字段,并确保在更改类后更新相应的类型适配器。更糟糕的是,添加自定义类型适配器会使这些注释支持丢失

另一种解决方法是注入一个特殊的字符串类型适配器工厂,该工厂可以实现这一点,但由于其注入机制,这既有局限性,又需要复制
@Masked
注释值(如果您在代码的其他地方使用注释)以及
@JsonAdapter
中的类型适配器工厂配置

公共抽象类掩码TypeAdapterFactory
实现TypeAdapterFactory{
私人最终int exposeFront;
私人最终国际展览;
私有最终字符掩码;
专用掩码TypeAdapterFactory(最终整型暴露前、最终整型暴露前、最终字符掩码){
this.exposeFront=exposeFront;
this.exposeRear=exposeRear;
这个面具=面具;
}
//必须“烘焙”到类中(名称仅表示配置)
公共静态最终类_2_2_星号
扩展MaskedTypeAdapterFactory{
专用2_2_2_2星号(){
超级(2,2,“*”);
}
}
@凌驾
@可空
公共类型适配器创建(最终Gson Gson、最终TypeToken TypeToken){
if(typeToken.getRawType()!=String.class){
返回null;
}
@抑制警告(“未选中”)
最终的TypeAdapter委托=(TypeAdapter)gson.getAdapter(typeToken);
最终类型适配器类型适配器=新类型适配器(){
@凌驾
公共无效写入(最终JsonWriter out,最终字符串值)
抛出IOException{
//屏蔽该值
最终整数长度=value.length();
final char[]buffer=value.toCharArray();
对于(int i=exposeFront;i
@noargsconstuctor
@AllArgsConstructor
最后一节课我的课{
@序列化名称(“qwerty”)
@遮罩(exposeFront=2,exposeRar=2,Mask=“*”)
//不幸的是,这必须重复@Mask注释值
//因为类型适配器(工厂)不接受补充信息
//Java注释只能接受编译时常量
@JsonAdapter(MaskedTypeAdapterFactory.\u 2\u 2\u asterisk.class)
@抑制警告(“未使用”)
私人字符串qwerty;
}
测试:

公共最终类掩码TypeAdapterFactoryTest{
私有静态最终Gson Gson=new GsonBuilder()
.disableHtmlEscaping()
.disableInnerClassSerialization()
.create();
@试验
公开无效测试(){
最终字符串actual=gson.toJson(新的MyClass(“1234567890”);
应为最终字符串=“{\'qwerty\”:\“12*******90\”;
assertEquals(预期、实际);
}
}
这可能是Gson中实现这一点的最可靠的方法