开发者社区> 问答> 正文

@JSONField 注解 属性 deserializeUsing 反序列化化使用自定义类解密 B

2.0.5 版本 @JSONField 反序列化使用自定义类解密, 如何操作 1.2.83 使用

@JSONField(serializeUsing = IdCodec.class, deserializeUsing = IdCodec.class) private Integer id;

2.0.5 使用

@JSONField(writeUsing = IdCodec.class) private Integer id;

请问序列化使用 writeUsing = IdCodec.class 类hash 加密,反序列化如何解密,就如 1.2.x 版本 deserializeUsing = IdCodec.class

原提问者GitHub用户ang00

展开
收起
大圣东游 2023-04-21 12:03:25 807 0
2 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    在2.0.5版本中,可以使用@JSONPOJOBuilder(withPrefix = "")注解来指定反序列化时调用的构造方法,从而进行解密操作,具体步骤如下:

    1.首先,在自定义类(比如IdCodec)中,需要实现build方法用于反序列化解密操作,例如:

    public class IdCodec implements JSONCodec { @Override public void writeJSONString(Integer id, Appendable appendable) throws IOException { // 使用自定义hash加密算法将id加密成字符串 String encryptedId = encrypt(id); // 将加密后的字符串输出到JSON字符串中 appendable.append('"').append(encryptedId).append('"'); }

    @Override public Integer deserialze(DefaultJSONParser parser, Type type, Object fieldName) throws IOException { // 读取JSON字符串 String encryptedId = parser.parseObject(String.class); // 使用自定义hash解密算法将字符串解密成id Integer id = decrypt(encryptedId); // 返回解密后的id return id; } } 2.然后,在自定义类对应的属性中,使用@JSONField注解的serializeUsing属性指定序列化时使用的加密方式,例如:

    @JSONField(serializeUsing = IdCodec.class) private Integer id; 3.最后,在自定义类对应的属性中,使用@JSONField注解的deserializeUsing属性指定反序列化时使用的解密方式,并且在该类中添加一个静态内部类作为builder,例如:

    public class MyClass { @JSONField(writeUsing = IdCodec.class, deserializeUsing = IdCodecDeserializer.class) private Integer id;

    // 此处省略getter和setter方法

    @JSONPOJOBuilder(withPrefix = "") public static class IdCodecDeserializer implements ObjectDeserializer { @Override public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) throws IOException { // 调用一般构造方法来创建一个MyClass对象 MyClass obj = new MyClass(); // 调用IdCodec的deserialze方法来解密JSON字符串,并设置到MyClass对象的id属性中 obj.setId(new IdCodec().deserialze(parser, type, fieldName)); // 返回MyClass对象 return (T) obj; } } } 通过以上步骤,即可实现反序列化时使用自定义类解密。

    2023-04-21 21:17:06
    赞同 展开评论 打赏
  • 问题已经修复,请用新版本 https://github.com/alibaba/fastjson2/releases/tag/2.0.7

    写法如下:

    @Test
    public void test() {
        Bean bean = new Bean();
        bean.id = 123;
    
        String str = JSON.toJSONString(bean);
        assertEquals("{\"id\":\"123元\"}", str);
    
        Bean bean1 = JSON.parseObject(str, Bean.class);
        assertEquals(bean.id, bean1.id);
    }
    
    public static class Bean {
        @JSONField(serializeUsing = IdCodec.class, deserializeUsing = IdCodec.class)
        public int id;
    }
    
    public static class IdCodec
            implements ObjectReader, ObjectWriter {
        public long getFeatures() {
            return 0;
        }
    
        @Override
        public Object readObject(JSONReader jsonReader, long features) {
            String str = jsonReader.readString();
            str = str.replace("元", "");
            return Integer.parseInt(str);
        }
    
        @Override
        public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
            jsonWriter.writeString(object.toString() + "元");
        }
    }
    

    原回答者GitHub用户wenshao

    2023-04-21 14:50:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载