Solon v3.6.0

snack - Json 序列化类型安全控制

</> markdown

序列化类型安全控制,我们可以借助 ObjectEncoder(会优先匹配) 和 ObjectPatternEncoder 实现。

示例1:白名单风格

public class TypeSafety {
    @Test
    public void case1() {
        Options options = Options.of();
        
        //使用 ObjectFactory 模拟白名单
        options.addFactory(User.class, (opts, node, clazz) -> new User());
        options.addFactory(Order.class, (opts, node, clazz) -> new Order());

        //使用 ObjectPatternFactory 模拟黑名单
        options.addFactory(new ObjectPatternFactory<Object>() {
            @Override
            public boolean calCreate(Class<?> clazz) {
                return true;
            }

            @Override
            public Object create(Options opts, ONode node, Class<?> clazz) {
                throw new SnackException("");
            }
        });

        //效果测试
        Assertions.assertThrows(SnackException.class, () -> {
            ONode.deserialize("{id:1}", UserModel.class, options);
        });

        ONode.deserialize("{id:1}", Map.class, options);
    }
}

示例2:黑名单风格

public class TypeSafety {
    @Test
    public void case2() {
        //使用 ObjectPatternFactory 模拟黑名单
        Options options = Options.of().addFactory(new ObjectPatternFactory<Object>() {
            @Override
            public boolean calCreate(Class<?> clazz) {
                return true;
            }

            @Override
            public Object create(Options opts, ONode node, Class<?> clazz) {
               if(clazz.getName().startsWith("sun.")) {
                   //这里算黑名单
                   throw new SnackException("");
               } else {
                   return null; //返回 null 后,由框架自动处理
               }
            }
        });

        //效果测试
        Assertions.assertThrows(SnackException.class, () -> {
            ONode.deserialize("{id:1}", UserModel.class, options);
        });

        ONode.deserialize("{id:1}", Map.class, options);
    }
}