fastjson 反序列化问题

vqlkdk9b  于 2021-11-27  发布在  Java
关注(0)|答案(2)|浏览(381)

是否支持反序列化修改值,例如:

List<Memo> list = JSON.parseObject(data,
                new TypeReference<List<Memo>>() {
                }.getType(),
                processor);

private ExtraProcessor processor = (object, key, value) -> {
        Log.d(TAG, "--------object = "+ object);
        Log.d(TAG, "--------key = "+key);
        Log.d(TAG, "--------value = "+value);
        if (object instanceof Date) {
            ((Date) value).setTime(((Date) value).getTime() * 1000);
        }

    };

该方法需要修改Memo中的Data属性,将其值乘以1000,用来适配不同客户端之间的定义不同问题。测试时发现该方法processor方法体未执行,能否提供原因以及正确解法呢?

cfh9epnr

cfh9epnr1#

ExtraProcessor默认是用来处理多余字段的。不是用来反序列化时修改值的。如果你想在反序列化之后修改date的值可以实现ObjectDeserializer。写了一个例子,有什么不好的,请指正

public class ProcessTest {
   /**用于处理Memo对象反序列化*/
    public static class MemoDeserializer implements ObjectDeserializer {
        @Override
        public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
            Memo memo = null;
            if (((Class)type).getName().equals(Memo.class.getName())) {
                memo = (new JavaBeanDeserializer(parser.getConfig(), Memo.class)).deserialze(parser, type, fieldName);
                memo.setDate(new Date(memo.getDate().getTime()*1000));
            }

            return (T) memo;
        }

        @Override
        public int getFastMatchToken() {
            return JSONToken.LBRACE;
        }
    }

  /**Memo实体*/
    public static class Memo {
        private Date date;

        public Date getDate() {
            return date;
        }

        @JSONField
        public void setDate(Date date) {
            this.date = date;
        }
    }

  /**主方法*/
    public static void main(String[] args) {
        List<Memo> list = new ArrayList<>();
        Memo memo = new Memo();
        memo.setDate(new Date());
        list.add(memo);
        String data = JSON.toJSONString(list);
        System.out.println("Before:"+memo.getDate().getTime());
        System.out.println("data:"+data);

        ParserConfig config = ParserConfig.getGlobalInstance();
        config.putDeserializer(Memo.class, new MemoDeserializer());

        List<Memo> memos = Arrays.asList(JSON.parseObject(data, Memo[].class));
        System.out.println("After:"+memos.get(0).getDate().getTime());
    }
}
von4xj4u

von4xj4u2#

@huxizhun 这可以写的更通用些吗,我看你deserialze方法中是写死了类型,set方法也是写死的,是否可以判断字段类型为Date,就乘以1000呢

相关问题