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
在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; } } } 通过以上步骤,即可实现反序列化时使用自定义类解密。
问题已经修复,请用新版本 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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。