使用杰克逊,如何序列化参数化方法调用的结果以过滤子对象列表?

时间:2018-11-16 23:19:39

标签: java json jackson

我正在将SpringBoot / Hibernate用于我的应用程序框架。 我有一个为我的应用程序保存大量参数的类。它具有一些始终适用的参数,并且根据所处理的内容而有所不同(每个项目的参数)。它已被建模为包含一系列子类的父类,根据特定的上下文(例如,正在开发的项目,但实际案例具有确定“活跃”孩子的更为复杂的逻辑)。

在几乎所有情况下,我只想序列化当时适用的一个孩子,但是在少数情况下,我想序列化整个集合。

我可以使用以下方法实现它:

public class Parent {

    @JsonView(JsonViews.AllChildren.class)
    private Set<Child> children= new HashSet<>();

    @JsonIgnore
    private Context context;

    public void setContext (Context context) {
        this.context = context;
    }

    @JsonView(JsonViews.ActiveChild.class)
    @JsonProperty("activeChild")
    public Child getActiveChild() {

        for (Child child : this.children) {
            if (someFunction(this.context)) {
                return child;
            }
        }

        return null;
    }

然后在我的控制器中可以执行以下操作:

@GetMapping("/parent")
@JsonView(JsonViews.AllChildren.class)
public Parent getParent() {
    return ParentService.getParent();
}

@GetMapping("/parent/{context}")
@JsonView(JsonViews.ActiveChild.class)
public Parent getParentWithContext(PathVariable final String contextName)) {
    Context context = ContextService.getContextByName(contextName);
    Parent parent = ParentService.getParent();
    parent.setContext(context);
    return Parent;
}

效果很好,但是引入了一些我想避免的状态(在父级上设置上下文)。

所以现在的问题是:我该如何序列化父/子类以删除状态属性,例如像这样:

@JsonView(JsonViews.ActiveChild.class)
@JsonProperty("activeChild")
public Child getActiveChild(Context context) {

    for (Child child : this.children) {
        if (someFunction(context)) {
            return child;
        }
    }

    return null;
}

@GetMapping("/parent/{context}")
@JsonView(JsonViews.ActiveChild.class)
public Parent getParentWithContext(PathVariable final String contextName)) {
    Context context = ContextService.getContextByName(contextName);
    Parent parent = ParentService.getParent();

    // How to tell the Json serialization to pass the context to getActiveChild

    return Parent;
}

我发现的有关Json Context序列化的所有内容似乎都具有一组固定的上下文(消除了一个未知列表),可用于从输出中添加/删除属性,而不是过滤数据。

到目前为止,我发现的唯一解决方案是自己调用ObjectMapper以获得所有子项的完整json序列化,然后除去我要返回的子项之外的所有子项。但这意味着我有重复的“逻辑上有哪个孩子在该上下文中活动”逻辑集-一个在Parent类中用于Parent和Child对象,另一个在getParentWithContext函数中用于json表示。我能做些更好的事情吗?

  1. 执行一些自定义序列化程序,可以在呈现结果之前以某种方式在传递的上下文上调用父级的getActiveChild方法,或者
  2. 在渲染调用中设置上下文时,如何以某种方式使ThreadLocal?
  3. 以某种方式创建一个新类,以其构造函数中的Context类实例扩展我的Parent类并将其返回给Jackson进行序列化吗?
  4. 创建父级的克隆,在克隆上设置上下文,让其序列化然后在完成时进行垃圾回收?

0 个答案:

没有答案