【问题标题】:Exposing a subset of a Java object to JSON将 Java 对象的子集公开给 JSON
【发布时间】:2016-05-13 23:58:27
【问题描述】:

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

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

我担心的是,如果对后端 Metric 对象进行了更改(例如开发人员添加了一个新的秘密 ID 字段),我们不想将其从前端服务中公开。

我们还在为前端服务编写 clientSDK。我们不想从后端 clientSDK 中引用 Metric 类,所以合乎逻辑的选择是在前端 SDK 中定义一个类似的 Metric 对象。

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

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

我们将 Jackson 与 Spring rest 框架一起用于上下文,但我很乐意立即放弃它,因为通过注释封送对象似乎是这个问题的根本原因。

【问题讨论】:

    标签: java json spring rest


    【解决方案1】:

    看看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;
    }
    

    @JsonView 注释在 Spring 4.1 的 Spring @ResponseBody 注释方法上受支持。

    【讨论】:

    • 还有一个 @JsonIgnore 注释,这取决于 OP 的确切设置可能是更容易的选择。
    【解决方案2】:

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

    但是,您可以像这样简单地使用继承和强制转换:

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

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

    【讨论】:

      【解决方案3】:

      另一种可能是使用Mixins,这样你就可以定义不同的场景而无需触及原来的DTO

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

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

      这适用于不太深的图,否则有人在这里以类似的方式编写了另一种方法,在这些情况下似乎性能更高,但行为有点不同。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2021-09-26
        相关资源
        最近更新 更多