将Java对象的子集公开给JSON

时间:2016-05-13 23:58:27

标签: java json spring rest

我们有一个前端服务,它使用后端服务来获取Metric对象列表。我们为后端服务编写了一个Java ClientSDK,以便更轻松地开发该服务的客户端应用程序。

我们还会从前端服务公开指标列表。目前,我们直接将后端Metric对象公开并转换为JSON。

我担心的是,如果对后端Metric对象进行了更改 - 比如说开发人员添加了新的密码ID字段 - 我们不希望从前端服务公开它。

我们还为前端服务编写了clientSDK。我们不想从后端clientSDK引用Metric类,因此逻辑选项是在前端SDK中定义类似的Metric对象。

我不想浪费CPU周期将1000个度量标准从一个类定义复制到另一个类定义。

有没有办法指定我应该从后端Metric向Metric的前端定义公开哪些字段,因为我转换为JSON?更好的是,我可以将前端定义引用到JSON转换器,因为我要求它封送后端对象吗?

我们正在将Jackson与Spring rest框架用于上下文,但我很乐意将其放在心跳中,因为通过注释对对象进行编组似乎是导致此问题的根本原因。

3 个答案:

答案 0 :(得分:3)

看看Jackson's JsonView构造。

我可以看到你的例子看起来像这样:

class Views {
    static class Client {}
    static class Backend extends Client {}
}

public class Metric {
    @JsonView(Views.Client.class) String metricName;
    @JsonView(Views.Client.class) String count;
    @JsonView(Views.Backend.class) String secretKey;
}

Spring 4.1起,Spring @JsonView注释方法支持@ResponseBody注释。

答案 1 :(得分:0)

正如Nicholas Hausschild建议您可以通过编组/解组框架的注释来实现此目的。

但是你可以像这样简单地使用继承和转换:

class SomeSuperClass {
  String exposeThis;
  String exposeThat;
  // getters and setters...
}

class SomeSubClass extends SomeSuperClass {
  String doNotExposeThis;
  // getters and setters...
}

这样,您可以在将对象返回到JSON解析器时强制转换为超类,同时在内部使用子类来携带您不想要公开的其他信息。

答案 2 :(得分:0)

另一种可能性是使用Mixins,因此您可以在不触及原始DTO的情况下定义不同的方案。

我自己使用我编写的库来动态实现:

https://github.com/Antibrumm/jackson-antpathfilter

这适用于不太深的图形,否则有人在这里以类似的方式编写了另一种方法,这些方案看起来更有效,但行为有点不同。

https://github.com/krishna81m/jackson-nested-prop-filter