fastjson 自定义转换器 适合所有数据类型

fastjson 序列化反序列化配置。

 

自定义转换器

1 类转 JSON,   继承 EnumSerializer等 fastjson 已经的或者  实现  ObjectSerializer 接口

    config.getSerializeConfig().put(Double.class, new DoubleSerializerConfig(new DecimalFormat("0.00")));

添加进配置

2 JSON转类   实现  ObjectDeserializer  接口

 config.getParserConfig().getDeserializers().put(OrderStatusEnum.class, new OrderStatusEnumSerializerConfig());

添加进配置

 

代码如下:

@Configuration
@Slf4j
public class FJsonConfig {



    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.getSerializeConfig().put(Double.class, new DoubleSerializerConfig(new DecimalFormat("0.00")));
        config.getSerializeConfig().put(Enum.class,new OrderStatusEnumSerializerConfig());
        config.getParserConfig().getDeserializers().put(OrderStatusEnum.class, new OrderStatusEnumSerializerConfig());
        return new HttpMessageConverters(converter);
    }

    /**
     * Double格式保留两位小数点(0.00)
     */
    public static class DoubleSerializerConfig extends DoubleSerializer {

        private DecimalFormat decimalFormat = null;

        public DoubleSerializerConfig(DecimalFormat decimalFormat) {
            this.decimalFormat = decimalFormat;
        }

        public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
                throws IOException {
            SerializeWriter out = serializer.out;

            if (object == null) {
                out.writeNull(SerializerFeature.WriteNullNumberAsZero);
                return;
            }

            double doubleValue = ((Double) object).doubleValue();

            if (Double.isNaN(doubleValue) || Double.isInfinite(doubleValue)) {
                out.writeNull();
            } else {
                if (decimalFormat == null) {
                    out.writeDouble(doubleValue, true);
                } else {
                    String doubleText = decimalFormat.format(doubleValue);
                    out.write("\"" + doubleText + "\"");
                }
            }
        }
    }

    public static class OrderStatusEnumSerializerConfig extends EnumSerializer implements ObjectDeserializer {

        public final static OrderStatusEnumSerializerConfig instance = new OrderStatusEnumSerializerConfig();
        private final Member member;

        public OrderStatusEnumSerializerConfig() {
            this.member = null;
        }

        public OrderStatusEnumSerializerConfig(Member member) {
            this.member = member;
        }
        public void write(JSONSerializer serializer, Object object, Object fieldName, java.lang.reflect.Type fieldType, int features) throws IOException {
            SerializeWriter out = serializer.out;
            if (object instanceof OrderStatusEnum) {
                //这里用 int  10 会变成   (10
                //多一个左边的括号 不知道为什么
                out.write(((OrderStatusEnum) object).toJSONString());
            } else if (member == null) {
                out.writeEnum((Enum<?>) object);
                return;
            }
            if (object instanceof OrderStatusEnum) {
                //这里用 int 10 会变成   (10
                //多一个左边的括号 不知道为什么
                serializer.write( ((OrderStatusEnum) object).toJSONString());
                return;
            }
            Object fieldValue = null;
            try {
                  if (member instanceof Field) {
                    fieldValue = ((Field) member).get(object);
                } else {
                    fieldValue = ((Method) member).invoke(object);
                }
            } catch (Exception e) {
                throw new JSONException("getEnumValue error", e);
            }

            serializer.write(fieldValue);
        }
        @Override
        public <T> T deserialze(DefaultJSONParser parser, java.lang.reflect.Type type, Object fieldName) {
            int value = (int) parser.parse();
            for (OrderStatusEnum statusEnum : OrderStatusEnum.values()) {
                if (statusEnum.getCode() == value) {
                    return (T) (statusEnum);
                }
            }
            return (T) (OrderStatusEnum.CREATE);
        }

        @Override
        public int getFastMatchToken() {
            return 0;
        }
    }
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fastjson支持自定义转换规则,可以通过实现自定义的序列化器(Serializer)和反序列化器(Deserializer)来实现。下面是一个简单的示例,演示如何自定义一个日期格式的序列化和反序列化规则: 首先,定义一个日期格式化的序列化器: ```java public class DateSerializer implements Serializer<Date> { @Override public void write(JSONSerializer serializer, Date date, Object fieldName, Type fieldType, int features) throws IOException { if (date == null) { serializer.writeNull(); return; } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); serializer.write(format.format(date)); } } ``` 然后,定义一个日期格式化的反序列化器: ```java public class DateDeserializer implements ObjectDeserializer { @Override public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { String dateStr = parser.parseObject(String.class); if (StringUtils.isEmpty(dateStr)) { return null; } try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return (T) format.parse(dateStr); } catch (ParseException e) { throw new JSONException("parse date error", e); } } @Override public int getFastMatchToken() { return JSONToken.LITERAL_STRING; } } ``` 最后,使用自定义的序列化器和反序列化器: ```java SerializeConfig.getGlobalInstance().put(Date.class, new DateSerializer()); ParserConfig.getGlobalInstance().putDeserializer(Date.class, new DateDeserializer()); ``` 这样,当Fastjson序列化或反序列化包含日期类型的对象时,就会使用我们自定义的日期格式化规则。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值