FastJson自定义序列化器 - ZhangTory's NoteBlog - 张耀誉的笔记博客

FastJson自定义序列化器

需求:将BigDecimal序列号为字符串(非科学计数法)
枚举类型进行自定义序列化and反序列化。

编写测试类:

@Data
static class JTest {
    @JSONField(serializeUsing = ToStringSerializer.class)
    BigDecimal amount;
}

public static void main(String[] args) {
    JTest jTest = new JTest();
    jTest.setAmount(new BigDecimal("5464654646546546545646465444444444444444444"));
    String str = JSONObject.toJSONString(jTest);
    System.out.println(str);
    JTest jTest2 = JSONObject.parseObject(str, JTest.class);
    System.out.println(jTest2);
    System.out.println(jTest2.getAmount().toPlainString());
}

ToStringSerializer是调用的toString()方法,不满足要求,就需要自定义序列号器。
自定义序列号器实现ObjectSerializer接口。

package com.alibaba.fastjson.serializer;

反序列化器实现ObjectDeserializer接口。

package com.alibaba.fastjson.parser.deserializer;

参考ToStringSerializer实现一个满足要求的序列化器:

public class BigDecimalToStringSerializer implements ObjectSerializer {
    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.out;
        if (object == null) {
            out.writeNull();
            return;
        }
        if (object instanceof BigDecimal) {
            String val = ((BigDecimal) object).toPlainString();
            out.writeString(val);
        } else {
            out.writeString(object.toString());
        }
    }
}

反序列化同理,可以参考官方自带的反序列化器进行修改。
由此我们可以衍生出其他需求的用法,比如对枚举进行序列化或反序列化。

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。