如何在Jackson ObjectMapper将POJO转为JsonNode时使用JsonView
解决Jackson中结合JsonView使用valueToTree的问题
这确实是Jackson里一个容易踩的小细节——valueToTree()方法本身确实没有直接提供结合JsonView的重载,但其实我们完全可以通过ObjectWriter来实现同样的需求,而且用法和你熟悉的序列化字节/字符串的方式几乎一致,给你两种实用方案:
方案一:使用ObjectWriter的writeValueAsTree(推荐)
这是最直接高效的方式,你可以先通过writerWithView()创建携带指定视图的ObjectWriter,然后调用它的writeValueAsTree()方法直接生成过滤后的JsonNode,完全不需要中间的字符串或字节转换:
ObjectMapper mapper = new ObjectMapper(); // 创建携带指定JsonView的ObjectWriter ObjectWriter viewWriter = mapper.writerWithView(User.WithRoles.class); // 直接生成过滤后的JsonNode JsonNode filteredJsonNode = viewWriter.writeValueAsTree(myUser);
这个方法本质上和valueToTree()的底层逻辑一致,但继承了ObjectWriter的所有配置(包括你的JsonView规则),完美匹配你的需求。
方案二:序列化后反序列化(兼容旧版本)
如果你的Jackson版本比较旧,ObjectWriter没有writeValueAsTree()方法,也可以用你熟悉的序列化+反序列化的方式:
ObjectMapper mapper = new ObjectMapper(); // 先用JsonView过滤序列化字符串 String filteredJsonStr = mapper.writerWithView(User.WithRoles.class) .writeValueAsString(myUser); // 再把字符串反序列化为JsonNode JsonNode filteredJsonNode = mapper.readTree(filteredJsonStr);
这个方法的优点是兼容性极强,缺点是会多一次字符串的序列化/反序列化过程,对于超大对象可能有轻微的性能损耗,但绝大多数业务场景下完全可以忽略。
补充说明
为什么valueToTree()不支持JsonView?因为valueToTree()是ObjectMapper的基础方法,它默认使用全局的序列化配置,不会携带自定义的视图规则;而ObjectWriter就是Jackson用来封装各种自定义序列化配置(包括视图、过滤规则、格式化选项等)的工具类,所以用它来实现带视图的树转换才是设计的初衷。
内容的提问来源于stack exchange,提问作者K. M
相关产品推荐
相关产品推荐

