Jackson - 如何在运行时找到活动的 JsonView

Posted

技术标签:

【中文标题】Jackson - 如何在运行时找到活动的 JsonView【英文标题】:Jackson - how to find active JsonView at runtime 【发布时间】:2015-12-21 12:06:27 【问题描述】:

我有包装 JPA 实体的 UI 对象,并且在该 UI 对象的构造函数中,我会延迟加载一些属性。在同一个构造函数中,我需要知道 JsonView 当前处于活动状态,所以我不会延迟加载一些不需要的字段,如果说它是 List 视图。 有没有办法从构造函数中找出运行时当前活动的 JsonView 是什么。或者有没有其他方法可以实现我上面描述的。

我目前的计划 创建自定义序列化程序,在序列化期间将调用它序列化的对象的 setJsonView(Class jsonView)。我所有的序列化对象都必须支持该方法。在那个metid里面,我可以基于现在已知的json视图进行延迟加载。像这样的:

public class JsonViewSerializer extends JsonSerializer<BaseSerializableEntity> 

  @Override
  public void serialize(BaseSerializableEntity value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException 
    value.setJsonView(provider.getSerializationView());
    // need to pass serialization to base class...
  


【问题讨论】:

【参考方案1】:

当前活动视图可通过上下文对象(SerializerProviderDeserializationContext)访问,使用方法 getActiveView()

【讨论】:

那么如何从构造函数中获取 SerializerProvider 呢? 没有办法做到这一点。在序列化过程中,您需要从序列化程序的 serialize() 方法中确定视图。 谢谢。我在上面概述了我的解决方案。唯一不清楚的部分是如何调用基类序列化函数序列化。我只想将一些东西注入到值对象中并将控制权传递回基础。 @AndreiV 这有点复杂,具体取决于您注册序列化程序的方式。如果它是为一种类型注册的,您不能简单地查找“原始”类型(因为您有效地替换了它)。但是,您可以使用BeanSerializerModifier(通过模块注册)来获取原始序列化程序,保持对它的引用,构造并返回自定义序列化程序,而不是那样注册。如果是这样,请确保实现 ContextualSerializer,委托该调用。 我明白了。感谢您对 StaxMan 的帮助。

以上是关于Jackson - 如何在运行时找到活动的 JsonView的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 解析 JSON 详细教程

Jackson 解析 JSON 详细教程

Jackson 解析 JSON 详细教程

jackson使用入门

Jackson 框架JSONXMLListMap直接相互转换

spring-boot-framework 如何自动将对象返回成json格式