定制序列化之@JSONType的使用

package com.ant.jdk8.json;

import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.annotation.JSONType;

import java.util.Date;

@JSONType(includes = {"name","hireDate"},ignores = {"age"})
public class User {

    private String name;

    private int age;

    @JSONField(format="yyyy-MM-dd HH:mm:ss")
    private Date hireDate;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }

    public User(String name, int age, Date hireDate) {
        this.name = name;
        this.age = age;
        this.hireDate = hireDate;
    }

    public User() {
    }
}
package com.ant.jdk8.json;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class JsonDemo {

    public static void main(String[] args) {
        convertCollectionToJson();
    }

    public static void convertCollectionToJson(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("tom",20,new Date()));
        userList.add(new User("jack",25,new Date()));
        String jsonString = JSON.toJSONString(userList,true);//true表示转换为带格式的json文本
        System.out.println(jsonString);
    }

}

转载于:https://www.cnblogs.com/i-hard-working/p/9221483.html

`@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、付费专栏及课程。

余额充值