fastjson @JSONType 使用


fastjson @JSONType 使用

 

 

**********************

相关注解

 

@JSONType:标注在类上

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface JSONType {

    String[] orders() default {};      //字段序列化顺序

    String[] includes() default {};    //包含的序列化字段
    String[] ignores() default {};     //不包含的序列化字段

    Class<?> serializer() default Void.class;     //自定义序列化类
    Class<?> deserializer() default Void.class;   //自定义反序列化类

    Class<? extends SerializeFilter>[] serialzeFilters() default {};


    SerializerFeature[] serialzeFeatures() default {};
    Feature[] parseFeatures() default {};
    
    boolean asm() default true;
    boolean alphabetic() default true;    
    boolean serializeEnumAsJavaBean() default false;
    
    String typeName() default "";
    String typeKey() default "";
    
    Class<?>[] seeAlso() default{};
    Class<?> mappingTo() default Void.class;   
    Class<?> builder() default Void.class;

    PropertyNamingStrategy naming() default PropertyNamingStrategy.CamelCase;

    Class<? extends ParserConfig.AutoTypeCheckHandler> autoTypeCheckHandler() default ParserConfig.AutoTypeCheckHandler.class;
}

 

 

**********************

示例

 

@Data
@JSONType(orders = {"amount","price","productId","productName"})
class Product{

    private String productId;
    private String productName;

    private Double price;
    private Integer amount;
}

public class Test4 {

    public static void main(String[] args){
        Product product=new Product();
        product.setProductId("2");
        product.setProductName("apple");
        product.setPrice(4d);
        product.setAmount(10);

        System.out.println(product);
        System.out.println(JSON.toJSONString(product));
    }
}

 

*****************

控制台输出

 

Product(productId=2, productName=apple, price=4.0, amount=10)
{"amount":10,"price":4.0,"productId":"2","productName":"apple"}

序列化字符串按照指定顺序输出

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`@JSONType` 注解是 fastjson 提供的一种用于自定义序列化和反序列化的注解。其中,`serializer` 属性用于指定一个实现了 `com.alibaba.fastjson.serializer.JSONSerializer` 接口的类,用于自定义序列化逻辑。`EnumDeserializer` 属性用于指定一个实现了 `com.alibaba.fastjson.parser.deserializer.ObjectDeserializer` 接口的类,用于自定义反序列化逻辑。 具体来说,`serializer` 属性可以用于以下场景: - 自定义序列化某个特定类型的逻辑,比如日期类型、枚举类型等; - 为某个类或者属性指定一个特定的序列化器,用于序列化 JSON。 而 `EnumDeserializer` 属性则主要用于自定义反序列化枚举类型的逻辑。当 fastjson 在反序列化 JSON 时遇到一个枚举类型时,它会首先根据枚举值的名称或者序号来尝试匹配对应的枚举值。如果匹配失败,fastjson 就会调用 `EnumDeserializer` 实例的 `deserialze` 方法来尝试自定义的反序列化逻辑。 下面是一个示例代码,展示了如何使用 `@JSONType` 的 `serializer` 和 `EnumDeserializer` 属性: ```java public enum Gender { MALE, FEMALE } @JSONType(serializer = MyDateSerializer.class) public class Person { private String name; private Gender gender; private Date birthday; // getters and setters } public class MyDateSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { // 自定义日期类型的序列化逻辑 } } public class MyEnumDeserializer implements ObjectDeserializer { @Override public Gender deserialze(DefaultJSONParser parser, Type type, Object fieldName) { // 自定义枚举类型的反序列化逻辑 } } // 使用 MyEnumDeserializer 反序列化 Gender 类型 JSON.parseObject("{\"name\":\"Tom\",\"gender\":\"MALE\",\"birthday\":\"2022-07-01\"}", Person.class, Feature.SupportNonPublicField); ``` 在上面的代码中,我们定义了一个 `Person` 类,其中使用了 `@JSONType` 注解,指定了 `MyDateSerializer` 类作为日期类型的序列化器。同时,我们还定义了一个 `MyEnumDeserializer` 类,用于自定义 `Gender` 枚举类型的反序列化逻辑。最后,我们使用 `JSON.parseObject` 方法来反序列化 JSON,其中传入了 `Feature.SupportNonPublicField` 参数,用于支持反序列化私有属性。由于我们指定了 `MyEnumDeserializer` 类作为 `Gender` 类型的反序列化器,因此 fastjson使用 `MyEnumDeserializer` 中的逻辑来尝试反序列化 `Gender` 类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值