AutoTypeCheckHandler现在是去掉了吗?FastJson从1.2.76 升级到2.0.22后,发现原来@JSONType注解里面的autoTypeCheckHandler属性没有了。想问下,这个去掉了,现在要怎么在反序列化自动判断类型?
测试了下,AutoTypeCheckHandler生效了。
要注意的是,安全模式的配置要换下,之前的-Dfastjson.parser.safeMode=true没用了,要换成-Dfastjson2.parser.safeMode=true。报错信息跟之前有变化,不再是safeMode not support autoType,变成了No suitable ObjectReader found。
另外有个意外发现,FastJson2现在可以识别Jackson的注解。通过Jackson的注解就可以完成反序列化时的自动类型判断。 代码如下(安全模式下):
// 抽象类定义 @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "method", visible = true ) @JsonSubTypes({ @JsonSubTypes.Type(value = BankDepositPayMethod.class, name = "BANK"), @JsonSubTypes.Type(value = BankDirectPayMethod.class, name = "BANK_DIRECT"), @JsonSubTypes.Type(value = BillPayMethod.class, name = "BILL"), @JsonSubTypes.Type(value = MarginPayMethod.class, name = "FILL_MARGIN") }) //@JSONType(autoTypeCheckHandler = PayMethodAutoTypeCheckHandler.class) @Data public abstract class PayMethod implements Serializable {
public static final String BILL = "BILL";
public static final String BANK = "BANK";
public static final String BANK_DIRECT = "BANK_DIRECT";
public static final String FILL_MARGIN = "FILL_MARGIN";
/**
* 方法
*/
@NotBlank
private String method;
/**
* 支付金额
*/
@NotNull
private BigDecimal amount;
}
// 测试代码
@Test
public void testDeserialize() {
List<PayMethod> list = new ArrayList<>();
BillPayMethod payMethod = new BillPayMethod();
payMethod.setMethod("BILL");
payMethod.setAmount(new BigDecimal("100"));
BankDepositPayMethod payMethod1 = new BankDepositPayMethod();
payMethod1.setMethod("WER");
payMethod1.setAmount(new BigDecimal("500"));
list.add(payMethod);
list.add(payMethod1);
String s = JSON.toJSONString(list);
System.out.println("序列化后:" + s);
List<PayMethod> payMethods = JSON.parseArray(s, PayMethod.class);
System.out.println("反序列化后:" + JSON.toJSONString(payMethods, SerializerFeature.WriteClassName));
}
// 执行结果 序列化后:[{"method":"BILL","amount":100},{"method":"BANK","amount":500}] 反序列化后:[{"method":"BILL","amount":100},{"method":"BANK","amount":500}]
原提问者GitHub用户Lhcnicholas
FASTJSON 2为了方便jackson的用户迁移,内置识别了Jackson的Annotation
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。