fastjson序列化时间自定义格式

Java8 的日期相关 API用起来是真香,但免不了遇到在用旧版 1.0 API 的情况。这不,跟另一个部门做对接,人家说你发过来的时间怎么带个 T,我这边没法解析。。。我回头就是一句xxx,情绪发泄完该做的事咱也得做不是,下面就看看怎么处理这个问题。
首先建一个项目,添加依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.80</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
    </dependencies>

写个带有时间属性的类,就叫 Task 吧,

@Data
@Accessors(chain = true)
public class Task {

    private String name;

    private LocalDateTime startTime;

    private LocalDateTime endTime;
}

看一下 fastjson 序列化方法,发现可以传个配置对象,看看这个能不能解决问题

/**
 * @param object 要序列化的对象
 * @param config 序列化配置
 * @param features
 */
public static String toJSONString(Object object, SerializeConfig config, SerializerFeature... features)

这个配置类里面有一个 put 方法,可以设置不同的类型使用不同的序列化器,所以我们可以通过给日期类型设置自定义的序列化器来实现自定义日期格式

/**
 * @param type 类型
 * @param value 序列化器
 */
public boolean put(Type type, ObjectSerializer value)

自定义序列化器并重写序列化方法,这里只针对 LocalDateTime 类型进行了自定义,其他类型如出一辙。

public class JsonSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.getWriter();
        if (object == null) {
            serializer.getWriter().writeNull();
            return;
        }
        // 对LocalDateTime类型进行格式转化
        out.write("\"" + ((LocalDateTime) object).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "\"");
    }
}

配置类中注入 Spriing 容器

@Configuration
public class JsonConfig {

    @Bean
    public SerializeConfig serializeConfig() {
        SerializeConfig config = new SerializeConfig();
        // 对LocalDateTime类型指定自定义的序列化器
        config.put(LocalDateTime.class, objectSerializer());
        return config;
    }

    @Bean
    public ObjectSerializer objectSerializer() {
        return new JsonSerializer();
    }
}

写个接口坐下测试

@RestController
@RequestMapping
public class FastJsonDemo {

    @Autowired
    private SerializeConfig serializeConfig;

    @RequestMapping("/test")
    public String jsonTest() {
        LocalDateTime now = LocalDateTime.now();
        Task task = new Task().setName("拯救地球任务").setStartTime(now).setEndTime(now.plusDays(10));
        return JSON.toJSONString(task, serializeConfig);
    }
}

浏览器调用接口,看下结果
image.png

日期里面的 T 没有了,搞定!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
fastjson 2.0.0 中,实现自定义序列化器需要实现AutoTypeSupport接口,并在ParserConfig中注册该反序列化器。 下面是一个示例,假设我们有一个Person类: ```java public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } // getter、setter方法省略 } ``` 我们想要将一个JSON字符串反序列化成Person对象,其中JSON字符串中包含了一个自定义的type字段,用于指定反序列化成哪个类。例如: ```json { "type": "student", "name": "张三", "age": 20 } ``` 我们可以定义一个自定义的反序列化器,用于根据type字段的值反序列化成不同的类。示例代码如下: ```java public class PersonDeserializer implements ObjectDeserializer, AutoTypeSupport { @Override public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { JSONObject jsonObject = parser.parseObject(); String typeValue = jsonObject.getString("type"); Class<? extends Person> clazz = getTypeClass(typeValue); if (clazz == null) { throw new JSONException("Unsupported type: " + typeValue); } return parser.parseObject(jsonObject.toJSONString(), clazz); } @Override public int getFastMatchToken() { return JSONToken.LBRACE; } @Override public boolean isAutoType(Class<?> clazz, String typeName) { return clazz == Student.class || clazz == Teacher.class; } @Override public Type resolveType(String typeName) { if ("student".equals(typeName)) { return Student.class; } if ("teacher".equals(typeName)) { return Teacher.class; } return null; } private Class<? extends Person> getTypeClass(String typeName) { Type type = resolveType(typeName); if (type instanceof Class) { Class<?> clazz = (Class<?>) type; if (Person.class.isAssignableFrom(clazz)) { return (Class<? extends Person>) clazz; } } return null; } } ``` 在上面的代码中,我们实现了ObjectDeserializer和AutoTypeSupport两个接口。其中,ObjectDeserializer接口用于实现自定义序列化逻辑,AutoTypeSupport接口用于实现自定义的类型解析规则。 在deserialze方法中,我们首先解析出JSON对象,然后根据type字段的值获取需要反序列化成的类,最后调用JSONParser的parseObject方法将JSON对象反序列化成对应的类。 在isAutoType方法中,我们指定了支持反序列化成Student和Teacher两个类。在resolveType方法中,我们根据typeName解析出对应的Class对象。 最后,在ParserConfig中注册该反序列化器: ```java ParserConfig parserConfig = new ParserConfig(); parserConfig.setAutoTypeSupport(true); parserConfig.putDeserializer(Person.class, new PersonDeserializer()); ``` 以上就是使用 fastjson 2.0.0 实现自定义序列化器的步骤和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bright1st

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值