开发者社区> 问答> 正文

FastJson从1.2.76 升级到2.0.22后,AutoTypeCheckHandler现在是

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

展开
收起
白夜行fighting 2023-04-21 10:45:51 422 0
1 条回答
写回答
取消 提交回答
  • FASTJSON 2为了方便jackson的用户迁移,内置识别了Jackson的Annotation

    原回答者GitHub用户wenshao

    2023-04-21 13:40:39
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

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